1.题目:
汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,任何时候,在小圆盘上都不能放大圆盘,且在三根柱子之间一次只能移动一个圆盘。问应该如何操作?
2.分析:
这个问题显然需要用递归算法来解决,我们知道递归可以理解为方程式是f(n) = f(n-1) + a;那么我们可以这样来看待这个问题:
首先明确,我们的目标是将A上所有N个盘子移动至C。而对于B,我们可以将之看成一个中转站。那么就有下面这三步:
1.把 n-1 号盘子移动到缓冲区(A–>B)
2.把1号从起点移到终点(A–>C)
3.然后把缓冲区的n-1号盘子也移到终点。(B–>C)
3.来看看代码:
public static void move(char pos1,char pos3) {//move来实现盘子的移动
System.out.print(pos1+"->"+pos3+" ");
}
public static void hanoi(int n,char pos1,char pos2,char pos3) {
if(n == 1) {
move(pos1,pos3);
return;
}
hanoi(n-1,pos1,pos3,pos2);//开始位置,中途转接位置,目的位置
move(pos1,pos3);
hanoi(n-1,pos2,pos1,pos3);//开始位置,中途转接位置,目的位置
}
public static void main(String[] args) {
hanoi(1,'A','B','C');
System.out.println();
hanoi(2,'A','B','C');
System.out.println();
hanoi(3,'A','B','C');
System.out.println();
}
运行结果:
总结::
对递归的理解的要点主要在于放弃!
放弃你对于理解和跟踪递归全程的企图,只理解递归两层之间的交接,以及递归终结的条件!