• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
风和月
博客园    首页    新随笔    联系   管理    订阅  订阅

python实现汉诺塔问题

汉诺塔问题源于印度一个古老传说。相传大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上并规定,任何时候,在小圆盘上都不能放大圆盘,且在三根柱子之间一次只能移动一个圆盘。

 

1 def move(n, a, b, c):
2     if(n == 1):
3         print(a,"->",c)
4         return
5     move(n-1, a, c, b)
6     move(1, a, b, c)
7     move(n-1, b, a, c)
8 
9 move(3, "a", "b", "c")

函数运行结果:

1 a -> c
2 a -> b
3 c -> b
4 a -> c
5 b -> a
6 b -> c
7 a -> c

程序分析:

  • 首先我们定义了一个函数move(n,a,b,c),参数n代表a柱上的圆盘个数,a,b,c三个柱子的顺序代表要将a柱上的圆盘最终移动到c柱上,然后b柱作为中间柱。
  • 我们在递归函数中肯定会有终止递归的条件。第2到4行的代码就是表示,当a柱上的圆盘个数为1时,就中止递归并返回。因为此时a柱上面只有一个圆盘,肯定就是直接把圆盘从a柱移动到c柱了。
  • 第5行的代码move(n-1, a, c, b)表示,先得把a柱上的n-1个圆盘从a柱移动到b柱,这时c柱是中间辅助柱。第6行的代码move(1, a, b, c)表示,当条件n=1的时候,把a柱上剩下的1个最大圆盘从a柱移动到c柱。
  • 第7行的代码move(n-1, b, a, c)表示,现在n-1个圆盘已经转移到b柱上了,还是递归调用move函数,将n-1个圆盘从b柱移动到c柱,这时a柱是中间辅助柱。
  • 最后我们调用move函数将3个圆盘从a柱移动到到c柱。当移动64个圆盘时,只需要将调用函数move(n,a,b,c)中的n变为64即可。这个计算量是十分巨大的,也只能交给计算机去解决。
posted @ 2020-04-03 12:12  风和月  阅读(468)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3