初始介绍:

  1. 汉诺塔可以分为A,B,C三个塔,代表左,中,右三个塔。
  2. 可以先定义一个成员方法move(int num,char a,char b,char c),其中num代表有几层,如1,2,3层,a,b,c代表A,B,C三个塔。

过程分析:
1.只有一层的时候,只需要从A移动到C就可以了。 调用 move(1,A,B,C)方法,在move方法中可以用一句话表示该移动动作 print('A--->C');

2.有两层的时候,把最大盘子之外的移到B,再把最大的盘子移到C,再把B移到C。调用 move(2,A,B,C),A->B,相当于调用 move(1,A,C,B),A->C,相当于调用 move(1,A,B,C),
B->C,相当于调用 move(1,B,A,C)。
综上所述就是move(2,A,B,C)等于move(1,A,C,B)+move(1,A,B,C)+move(1,B,A,C)。

3.有三层的时候,我们在第二层发现移动两层从A到C,只需要调用函数move(2,A,B,C)。那么我们把最下面一层看成一个整体,把其他的层看成一个整体,这样就可以简略的看成只有"两层"了,那
么在三层的时候,上面两层就是一部分,按照两层时候来处理,先将最底层之外的从A移到B,调用 move(2,A,C,B),接着把最下面一层从A移到C,调用move(1,A,B,C),再把已经在B塔的上
面两层移到C塔,调用move(2,B,A,C),从前面我们知道移动是第二个参数到第四个参数。
综上所述就是move(3,A,B,C)等于move(2,A,C,B)+move(1,A,B,C)+move(2,B,A,C)。

方法代码:

public void move(int num, char a, char b, char c) {                   if (num == 1) {                     System.out.println(a + "->" + c);                 } else {                     move(num - 1, a, c, b);                     System.out.println(a + "->" + c);   //move(1,a,b,c);                     move(num - 1, b, a, c);                 }             }

调用:

C c1 = new C();         c1.move(3,'A','B','C');

结果:

java 三个汉诺塔递归 汉诺塔java递归流程图_java 三个汉诺塔递归

心得总结:
1.在只有一层的时候,调用move(1,A,B,C)方法,里面可以只放一个移动动作就可以了:print('A--->C'),那么所有的move(1,A,B,C)方法,都能用这个输出语句去替代,就可以当move函数在num==1的时候,输出print('A--->C')。

2.是由事物本身的经验去推导出算法,在第二层的时候,就是把第一层移到B,第二层移到C,再把B的移到C,移动的时候我们调用的是只有一层时候的算法:就是move(1,A,B,C),从第二个参数移到第四个参数。

3.我发现第二层拆开之后和第三层拆开区别就是第一项的move(1,A,C,B)和第三项的move(1,B,A,C)从1变成了2,后面的也是如此规律,那么就能写出我们的成员方法了。

4.我们在写这个程序的时候可以想着两层汉诺塔的方法去写,最后在得到普遍规律。