递归实例:汉诺塔问题|(Python实现)

递归实例:汉诺塔问题(Python实现)

汉诺塔问题的传说

汉诺塔

  1. 大梵天创造世界的时候做了三根金刚石柱子,在一根
    柱子上从下往上按照大小顺序摞着64片黄金圆盘
  2. 大梵天命令婆罗门把圆盘从下面开始按大小顺序重新
    摆放在另一根柱子上。
  3. 在小圆盘上不能放大固盘,在三根柱子之间一次只能
    移动一个圆盘
  4. 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亿年

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页