汉诺塔,3,4,5...柱,Python递归实现,思维启发

这篇博客详细介绍了使用递归方法解决汉诺塔问题,从3柱汉诺塔的基础解法开始,逐步扩展到4柱和5柱的情况。通过将复杂问题分解为更简单的子问题,利用递归策略实现圆盘的移动。在4柱汉诺塔中,提出了更高效的解法,避免了不必要的步骤。对于5柱汉诺塔,博主提出类似思路,继续将问题简化。文章强调了解决复杂问题时分解和递归的重要思维方法。
摘要由CSDN通过智能技术生成

3,4,5…柱 汉诺塔,递归实现处理
3柱汉诺塔:
【解题思路】
如何把底部最大的一个圆盘拿到最终的柱子,那就是把它分为最大圆盘和除去最大圆盘的圆盘整体,把其他整体移到单独柱子的时候,最大圆盘就可以移动,然后再把其他整体又看作新的移动对象,按照前面方法重复,那这个时候就用到递归

def three(x, a, b, c):
    if x == 1:
        print(a, '-->', c)
    else:
        three(x - 1, a, c, b)  # x-1个以整体移到b
        print(a, '-->', c)  # 剩下那个最大的移到c
        three(x - 1, b, a, c)  # x-1个变成新的问题:如何将x-1个从b移到c.(递归即可)

4柱
【解题思路】
3柱的解题思路已经清楚,4柱也好理解一下,如果按照3柱的方式,也是可以实现,但是浪费一根柱子,效率也太低了,这个时候,现在直接把二分法直接分成两个整体,,有个重点注意的,如果不清楚汉诺塔可能就会忽略,大盘无法放在小盘上,当你成功把上面一部分迁移到一根柱子上面,你会发现这根柱子在下面迁移另外一部分是不能使用的,那4根将会变成3根,这个时候就可以使用3根的解题方式解决,当下面部分迁移完成后,3根柱子又变成4根,那这样可以用上面方式把上面部分迁移到最终位置

def four(x, a, b, c, d):
    if x == 1:
        print(a, '-->', d)
    else:
        k = x // 2  # 先将A柱子上分为两部分n-k个盘子 和k个盘子
        four(x - k, a, c, d, b)  # 将A柱上方n–k个盘子经过C、D柱移至B柱
        three(k, a, c, d)  # 将A柱所剩的k个盘子经过C柱移至D柱。
        four(x - k, b, a, c, d)  # 将B柱上的所有盘子经过A、C柱移至D柱

5柱
【解题思路】
5柱这种方式并不是最佳解法,只是个人思维扩展,沿用4柱的解题思路处理,5柱变4柱,然后采用4柱方式处理,以此类推6,7,8…柱都可以采用这方式,有兴趣可以考虑一下最优解法

def fire(x, a, b, c, d, e):
    if x == 1:
        print(a, '-->', e)
    else:
        k = x // 2  # 先将A柱子上分为两部分n-k个盘子 和k个盘子
        fire(x - k, a, c, d, e, b)  # 将A柱上方n–k个盘子经过C、D柱移至B柱
        four(k, a, c, d, e)  # 将A柱所剩的k个盘子经过C柱移至D柱。
        fire(x - k, b, a, c, d, e)  # 将B柱上的所有盘子经过A、C柱移至D柱

思维启发:处理复杂个体,找出最简单个体的解决方案,相继把复杂个体分解成多个最简单的个体,,进行实现,虽然它并不是最佳方式,但是永远不会错

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值