什么是汉诺塔?
递归思路:
当只有一个盘子的时候,只需要从将A塔上的一个盘子移到C塔上。
当A塔上有两个盘子是,先将x塔上的1号盘子(编号从上到下)移动到y塔上,再将x塔上的2号盘子移动的z塔上,最后将y塔上的小盘子移动到z塔上。
当x塔上有3个盘子时,先将x塔上编号1至2的盘子(共2个)移动到y塔上(需借助z塔),然后将x塔上的3号最大的盘子移动到z塔,最后将y塔上的两个盘子借助x塔移动到z塔上。
当x塔上有n个盘子是,先将x塔上编号1至n-1的盘子(共n-1个)移动到y塔上(借助z塔),然后将x塔上最大的n号盘子移动到z塔上,最后将y塔上的n-1个盘子借助x塔移动到z塔上。
如图, 首先说一下将x上的三个盘子放到z上该怎么实现?
第一步,将第一个x上的圆盘移到z, x — > z
第二步,将第二个x上的圆盘移到y, x—>y
第三步,将z上的圆盘移到y, z—>y
第四步,将x上的圆盘移到z, x—>z
第五步,将y上的第一个圆盘移到x, y—>x
第六步,将y上的盘子移到z, y—>z
第七步,将x上的盘子移到z, x—>z
到这里就完成了简单的三个盘子的移动。这里把一个盘子看成一个整体,也可以把两个盘子看成一个整体来做,思路都是一样的。
下面是先将x上的前两个盘子看成 一个整体进行移动之后拆开再单独移动。其实也一样,最后还要将前两个拆开单独进行移动。
图一:基本思路
前两个x—>y //hanno(n-1,begin,end,mid);
x z y
前一个x—>z
第二个x—>y
前一个z—>y
第三个x—>z
前两个y—>z // hanno(n-1,mid,begin,end);
前一个y—>x y x z
第二个y—>z
前一个x—>z
图二:程序代码
class Hanno{
public static void main(String[] args){
//盘子的个数 出发 中间 目的
hanno(3,"X","Y","Z");
}
public static void hanno(int n,String begin,String mid,String end){
if(n==1){
System.out.println(begin+" -> "+end); //begin不一定是X,end不一定是Z,是变化的
}else{
hanno(n-1,begin,end,mid); //前n-1个从出发到中间,就比如将前两个盘子整体从x——>y
System.out.println(begin+" -> "+end);
hanno(n-1,mid,begin,end); //前n-1个从中间到目的,就比如将前两个盘子整体从y——>z
}
}
}
就比如三个盘子:hanno(n-1,begin,end,mid); 意思是:将前两个盘子从x移到y,借助z.此时begin为x,end为z,mid为y。同理,hanno(n-1,mid,begin,end);将前两个盘子从y移到z借助x。
执行结果:
再对比一下图一:
是不是恍然大悟了。