递归的应用——汉诺塔

中国大学MOOC,数据结构与算法(Python版)学习笔记
课程网址:“https://www.icourse163.org/course/PKU-1206307812”

问题描述

汉诺塔问题是法国数学家EdouardLucas于1883年,根据传说提出来的。传说在一个印度教寺庙里,有3根柱子,其中一根套着64个由小到大的黄金盘片,僧侣们的任务就是要把这一叠黄金盘从一根柱子搬到另一根,但有两个规则:一次只能搬1个盘子,大盘子不能叠在小盘子上。

解决思路

假设我们有5个盘子,穿在1#柱,需要挪到3 #柱;如果能有办法把最上面的一摞4个盘子统统挪到2#柱,那问题就好解决了:把剩下的最大号盘子直接从1#柱挪到3#柱;再用同样的办法把2#柱上的那一摞4个盘子挪到3#柱,就完成了整个移动。

接下来问题就是解决4个盘子如何能从1#挪到2#:此时问题规模已经减小!同样是想办法把上面的一摞3个盘子挪到3#柱,把剩下最大号盘子从1#挪到2#柱,再用同样的办法把一摞3个盘子从3#挪到2#柱;一摞3个盘子的挪动也照此:分为上面一摞2个,和下面最大号盘子;之后就直接是2个盘子的移动方法。

总结一下就是:

将盘片塔从开始柱,经由中间柱,移动到目标柱:首先将上层N-1个盘片的盘片塔,从开始柱,经由目标柱,移动到中间柱;然后将第N个(最大的)盘片,从开始柱,移动到目标柱;最后将放置在中间柱的N-1个盘片的盘片塔,经由开始柱,移动到目标柱。基本结束条件,也就是最小规模问题是:1个盘片的移动问题。

Python实现

def moveTower(height, fromPole, withPole, toPole):
    if height >= 1:
        moveTower(height-1, fromPole, toPole, withPole)
        moveDisk(height, fromPole, toPole)
        moveTower(height-1, withPole, fromPole, toPole)
        
def moveDisk(disk, fromPole, toPole):
    print(f"Moving disk[{disk}] from {fromPole} to {toPole}")

moveTower(3, "#1", "#2", "#3")

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值