Python for Kids
  • 0 前言
  • 1 编程环境准备
  • 2 运算符和表达式
  • 3 掌握变量
  • 4 字符串
  • 5 获取用户的输入
  • 6 条件判断
  • 7 条件判断实操
  • 8 FOR循环
  • 9 循环和列表
  • 10 WHILE循环
  • 11 WHILE循环实操
  • 12 WHILE循环再实操
  • 13 多重循环
  • 14 再谈列表
  • 15 初见函数
  • 16 函数实操
  • 17 选择排序
  • 18 冒泡排序
  • 19 递归算法之一
  • 20 递归算法实操
  • 21 快速排序
  • 22 汉诺塔游戏
  • 23 递推算法
  • 24 分治算法
  • 25 集合与组合
  • 26 贪心算法
  • 27 字典和键值对
  • 28 广度优先搜索算法
  • 29 数组和向量化计算
  • 30 随机和模拟
  • 31 数据可视化
  • 32 文件读取和分析
Powered by GitBook
On this page
  • 大纲
  • 汉诺塔游戏
  • 把大象装冰箱
  • 算法实现

Was this helpful?

22 汉诺塔游戏

用递归来玩游戏吧

Previous21 快速排序Next23 递推算法

Last updated 4 years ago

Was this helpful?

大纲

  • 汉诺塔问题

  • 把大象装冰箱

  • 算法实现

汉诺塔游戏

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

把大象装冰箱

解决这个问题需要化繁为简的递归思想,把最底下的红色圆盘当作大象,上面四个圆盘当作门。

图中是最常见的五层汉诺塔,其实几层都是一样,这里设为n,冰箱门永远是汉诺塔上面的m=n-1层。那么问题来了,怎样把冰箱门打开?即:怎样把图中的1至4号串珠从A柱移动到B柱?这又变成了一道m层汉诺塔的问题(m=n-1)。你可以继续用把大象装冰箱分几步的思路去考虑m层汉诺塔的解法。推导下去最终就得到了一个两层汉诺塔该怎么移动的问题,

算法实现

只需要使用递归来执行,在极限条件下,如果只有一个圆盘,就直接从a移动到c,如果大于1个,则执行递归。

# 一共有n层圆盘,一开始在A柱上,目标是要放到C柱上,以B柱作为过度。
def hanoi(n,a,b,c):
    if n==1:
        print(a,'->',c)
    else:
        hanoi(n-1,a,c,b)  # 把冰箱门打开
        print(a,'->',c)    # 把大象放进C柱
        hanoi(n-1,b,a,c)  # 把冰箱门关上
move(3,'A','B','C')
A -> C
A -> B
C -> B
A -> C
B -> A
B -> C
A -> C