递归实例:汉诺塔问题(Python实现)
汉诺塔问题的传说
- 大梵天创造世界的时候做了三根金刚石柱子,在一根
柱子上从下往上按照大小顺序摞着64片黄金圆盘 - 大梵天命令婆罗门把圆盘从下面开始按大小顺序重新
摆放在另一根柱子上。 - 在小圆盘上不能放大固盘,在三根柱子之间一次只能
移动一个圆盘 - 64根柱子移动完毕之日,就是世界毁灭之时
在3个盘子的时候
我先把三个盘子由大到小分别给编号1,2,3 三根柱子分别是a,b,c
1,把圆盘1从a移动到b处,把圆盘2从a移动到c处,把圆盘1从b移动到c处(就是把圆盘1和圆盘2经过b从a移动 到c处)
2,把圆盘3从a移动到b处
3,把圆盘1从c移动到a处,把圆盘2从c移动到b处,把圆盘1从a移动到b处(就是把圆盘1和圆盘2经过a从c移动到b处)
总结一下:
推广到n个圆盘的时候:
1.把n-1个圆盘从a经过b移动到c
2.把第n个圆盘从a移动到b
3.把n-1个小圆盘从c经过a移动到b
#定义一个名为汉诺塔的函数,令三个柱子分别为a,b,c,一共有n个圆盘
sum=0
def hanio(n,a,c,b):
global sum
if n >0:
hanio(n-1,a,b,c)#n-1个圆盘从a经过b移动到c
print(f"moving from {a} to {b}")
sum+=1
hanio(n-1,c,a,b)#n-1个圆盘从c经过a移动到b
n = input('请输入圆盘的个数:')
n = int(n)
hanio(n,'a','c','b')
print(f'一共移动的次数是{sum}')
感兴趣的朋友可以试试n=64时(但是要小心系统会蹦)
其实有人推出过计算公式次数h(n)=2^n-1
当n=64时 h(64)=18,446,744,073,709,551,615
假设婆罗门移动一个盘子需要一秒钟,那么移动完64个圆盘需要5800亿年!