Java实现汉诺塔问题(递归)
程序员文章站
2024-03-24 14:30:10
...
一、汉诺塔问题的由来
汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
二、思路
从简单到复杂,首先考虑一个圆盘,直接A–>C
两个圆盘,A–>B,A–>C,B–>C
三个圆盘,A–>C,A–>B,C–>B,A–>C,B–>A,B–>C,A–>C
.
.
.
每次挪n个圆盘,都需要借助一个空柱子,所以我们可以大胆想象,将n-1个圆盘挪到B上,再将第n个圆盘上到C上,而第n个是最大的盘子,所以这样不断重复,最后将这些圆盘移到目标盘C上。不难想象,满足这样的条件挪盘子,是需要耗费很长时间的。
三、代码
public class TowerHanio {
public static void move(char pos1,char pos2){
System.out.println(pos1+"--->"+pos2+" ");
}
public static void hanio(int n,char pos1,char pos2,char pos3){//盘子数,开始位置,中途转接位置,目的位置
if(n==1){
move(pos1,pos3);
return;
}
hanio(n-1,pos1,pos3,pos2);n-1个盘子,通过第三个空柱子挪到第二个柱子上
move(pos1,pos3);//最后一个盘子从第一个柱子,挪到第三个柱子
hanio(n-1,pos2,pos1,pos3);//这n-1个盘子,从第二个柱子通过第一个柱子,移到第三个柱子上
}
public static void main(String[] args) {
hanio(1,'A','B','C');//一个盘子的方法
System.out.println();//这里用于分割,使结果更容易看明白
hanio(2,'A','B' ,'C');
System.out.println();
hanio(3,'A','B' ,'C');
System.out.println();
}
}
当然,我这里只传了1、2、3个盘子的移动方法,相求其他的数字也可以在main函数中做修改,不过数字不建议过大哦!