Python实现汉诺塔问题的递归算法

  汉诺塔(Tower of Hanoi)是一个经典的数学问题。它包含三个柱子(通常称为A(start)、B(auxiliary)和C(end)),以及一组从小到大排列的圆盘,开始时所有圆盘都放在A柱子上。目标是将所有圆盘从A柱子移动到C柱子上,期间可以借助B柱子作为辅助。其规则是:一次只能移动一个圆盘,并且大圆盘不能在小圆盘上面

以三个圆盘为例子,他的移动过程如下:

动图

(图片来源:如何理解汉诺塔的递归? - 知乎 )

那么如何将n个圆盘移动到C列,其实这个过程我们可以看作三步:

1.把n-1个圆盘放到辅助列B

2.将A上剩余的一个圆盘放到C

3.将辅助列B上的n-1个圆盘拿到C

        想必看到这有人会问:万一n>2,不就不能同时移动n-1个圆盘了吗? 

        其实这就又变成了一道m层汉诺塔的问题(m=n-1),即如何将n-1个盘移动到辅助B列,只要先将n-2个移动到END列,再将此时最后一个盘移动到最终列B,最后将移至END列的n-2个盘移动到辅助B列

        只是此时以n-1个圆盘的视角来看,B列变成了我们的END最终列,C列也就变成了我们的auxiliary辅助列

我们来看代码:

def hanio(n, start, auxiliary,end):
    if n == 1:
        print("将圆盘从" + start + "移动到" + end)
    else:
        # 1. 将n -1个圆盘从A柱(start)经过C柱(end)移动到辅助柱B(auxiliary)
        hanio(n - 1, start, end,auxiliary)

        # 2. 将n个圆盘从A柱(start)移动到C柱(end)
        hanio(1, start, auxiliary, end)

        # 3. 将n-1个圆盘从辅助柱B(auxiliary)经过A柱(start)移动到C柱(end)
        hanio(n - 1, auxiliary, start, end)


hanio(3, "A", "B", "C")

以下是运行结果:

将圆盘从A移动到C
将圆盘从A移动到B
将圆盘从C移动到B
将圆盘从A移动到C
将圆盘从B移动到A
将圆盘从B移动到C
将圆盘从A移动到C

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值