标签:结果 运行 解决 放大 最大 bsp 通过 int span
汉诺塔问题源于印度的一个古老传说:梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。梵天命令婆罗门把圆盘按大小顺序重新摆放在另一根柱子上,并且规定小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。当所有的黄金圆盘都重新摆放在另一根柱子上时,世界就将在霹雳声中毁灭,梵塔、庙宇和众生都将同归于尽。
假设A是起始柱,B是中间柱,C是目标柱。
从最简单的例子开始看:
综上所述,如果需要移动n个圆盘,那么整个过程可以抽象成以下三个步骤:
1. 将除底盘以外的圆盘(n-1个圆盘)从A柱移动到B柱
2. 将底盘从A柱移动到C柱
3. 将B柱上的圆盘(n-1个圆盘)移动到C柱
从最复杂的例子开始看:
综上可以看出,通过不断重复嵌套,这个问题可以用递归方法解决。
def hanoi(n,a,b,c): # n表示需要移动几个圆盘,a代表起始柱,b代表中间柱,c代表目标柱 if n==1: # 如果只剩1个圆盘,那么将圆盘从a柱移动c柱即可 print(a,"->",c) else: # 当n > 1时,用抽象出的3步来移动 hanoi(n-1,a,c,b) # 将n-1个圆盘从a移动到b print(a,"->",c) # 将底盘从a移动到c hanoi(n-1,b,a,c) # 将b上的n-1个圆盘移动到c
试一下移动3个圆盘的步骤是否和前文一致:
hanoi(3,"A","B","C")
运行结果如下:
A -> C
A -> B
C -> B
A -> C
B -> A
B -> C
A -> C
可以看出,移动3个圆盘需要7步。根据推算,移动n个圆盘需要2n-1步。假设每次移动一个圆盘都是1秒钟的时间,婆罗门不停地在移动圆盘,那么总共需要(264-1)秒的时间,世界就会毁灭。按一年365天计,需要584,942,417,355.072年世界才会毁灭。
用递归方法解决汉诺塔问题(Recursion Hanoi Tower Python)
标签:结果 运行 解决 放大 最大 bsp 通过 int span
原文地址:http://www.cnblogs.com/HuZihu/p/7650161.html