汉诺塔问题的起源
汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,任何时候,在小圆盘上都不能放大圆盘,且在三根柱子之间一次只能移动一个圆盘。问应该如何操作?接下来我们将具体分析。
汉诺塔问题分析
将a柱上的64片圆盘规定移动到c柱上,一共需要移动约1800亿亿步(18,446,744,073,709,551,615),才能最终完成整个过程。可见这是一个极其复杂的过程。
为了将汉诺塔问题讲明白,以下将选择3片圆盘为例。
首先,我们先来探究汉诺塔问题的规律。
例一:
3片圆盘需要7步完成。
例二:
2片圆盘需要3步完成。
......
n片圆盘需要2^n-1步完成。
3片圆盘:
1.将c柱作为辅助,把a柱的上面2个圆盘移到b柱上。
2.将a柱最下方的第3个圆盘移到c柱上。
3.将a柱作为辅助,将b上的2个圆盘移动到c柱上。
……
n片圆盘:
1.将c柱作为辅助,把a柱上的n-1片圆盘移到b柱上。
2.将a柱最下方的第n个圆盘移到c柱上。
3.将a柱作为辅助,将b上的n-1个圆盘移动到c柱上。
所以代码为:hanoi(n-1,a,c,b);
Move(a,c);
hanoi(n-1,b,a,c);
上述代码为n!=1.
不必去考虑它的详细过程,掌握它的规律即可,因为不得不承认汉诺塔的过程很复杂,并且不符合我们人脑的正常逻辑,人脑是完成一件事情后再去做另一件,而汉诺塔问题中一碰到hanoi函数就递推下去,知道不符合递推条件在回归做之前未完成的事情。因此,我们把问题简化之后,剩下的就交给程序就好。
代码演示