鱼C论坛

 找回密码
 立即注册
查看: 2334|回复: 4

[已解决]关于汉诺塔的问题

[复制链接]
发表于 2022-8-3 17:03:09 | 显示全部楼层 |阅读模式
20鱼币
def haoni(n,x,y,z):
    if n==1:
        print(x,"-->",z)
    else:
        haoni(n-1,x,z,y)
        print(x,'-->',z)
        haoni(n-1,y,x,z)

n=int(input("请输入汉诺塔的层数"))
haoni(n,'A','B','C')
不懂原理以及层数与参数是如何联系在一起的
规则是一次只能移动一个,递归是如何实现的
最佳答案
2022-8-3 17:03:10
本帖最后由 N781791878 于 2022-8-3 19:08 编辑

看一下这样能不能理解:
hanoi(n,x,y,z)
==
hanoi(层数,圆盘所在的柱子,需要借助的柱子,目标柱子)  =======>就是不要看3个柱子的位置,只看3个柱子之间的关系。

#########################################################
#总的思路就是 (1:)假设有n个盘子,先把最底下的盘子(n)移到 "Z" 上;
#(2:)想要达成第一步,就要把上面的(n-1)个盘子移到 "Y" 上面
#(3:)以此类推

def haoni(n,x,y,z):        #要把n个盘子从"X"移到"Z"
    if n==1:
        print(x,"-->",z)     #当层数==1的时候:只有一个盘子需要移动,直接从  "X"  到  "Z"  就可以了
    else:
        haoni(n-1,x,z,y)    #要把(n-1)个盘子从"X"移到"Y"
        print(x,'-->',z)
        haoni(n-1,y,x,z)    #要把(n-1)个盘子从"Y"移到"Z"

n=int(input("请输入汉诺塔的层数"))
haoni(n,'A','B','C')

最佳答案

查看完整内容

看一下这样能不能理解: hanoi(n,x,y,z) == hanoi(层数,圆盘所在的柱子,需要借助的柱子,目标柱子) =======>就是不要看3个柱子的位置,只看3个柱子之间的关系。 ######################################################### #总的思路就是 (1:)假设有n个盘子,先把最底下的盘子(n)移到 "Z" 上; #(2:)想要达成第一步,就要把上面的(n-1)个盘子移到 "Y" 上面 #(3:)以此类推
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-8-3 17:03:10 | 显示全部楼层    本楼为最佳答案   
本帖最后由 N781791878 于 2022-8-3 19:08 编辑

看一下这样能不能理解:
hanoi(n,x,y,z)
==
hanoi(层数,圆盘所在的柱子,需要借助的柱子,目标柱子)  =======>就是不要看3个柱子的位置,只看3个柱子之间的关系。

#########################################################
#总的思路就是 (1:)假设有n个盘子,先把最底下的盘子(n)移到 "Z" 上;
#(2:)想要达成第一步,就要把上面的(n-1)个盘子移到 "Y" 上面
#(3:)以此类推

def haoni(n,x,y,z):        #要把n个盘子从"X"移到"Z"
    if n==1:
        print(x,"-->",z)     #当层数==1的时候:只有一个盘子需要移动,直接从  "X"  到  "Z"  就可以了
    else:
        haoni(n-1,x,z,y)    #要把(n-1)个盘子从"X"移到"Y"
        print(x,'-->',z)
        haoni(n-1,y,x,z)    #要把(n-1)个盘子从"Y"移到"Z"

n=int(input("请输入汉诺塔的层数"))
haoni(n,'A','B','C')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-8-3 17:34:15 | 显示全部楼层
如果把这个递归函数的形参名称改的清晰一些可能就更容易理解了。实际上应该是
def haoni(n,source,relay,destination):
    pass    # 内容省略
haoni 函数输出把 n 个(盘?)从 source 通过 relay 中转(如果需要)移动到 destination 的过程。对于只有一个盘的情况,直接从 source 移动到 destination 即可;对于不止一个的情况,我们可以首先将 n - 1 个盘从 source 移动到 relay (这里可以使用 destination 作为中转),然后把一个盘(剩下的,第 n 个盘)从 source 直接移动到 destination ,最后把先前临时移动到 relay 的所有盘(共 n - 1 个)移动到 destination (现在可以通过 source 中转)即完成全部 n 盘个以 relay 为中转从 source 移动到 destination 的工作。注意到上述过程中包含的两次移动 n - 1 个盘的操作同样满足 haoni 函数的定义,因此可以使用之。这一过程也就是代码第 5 到 7 行所做的事情。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-8-3 18:30:25 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-8-3 21:00:17 | 显示全部楼层
要把N个塔从A移到C,就得把N-1个塔移到B,再把最后一个塔从A移到C,再把N-1个盘挪到C
借助了B,B就是过度住;
那么现在已经知道了过程
函数就是:
1.如果要移一个,直接从源柱移到目标柱
2.把N-1个柱移从源柱移到过度住
3.把剩下一个塔移到目标住
4.把过度柱上的N-1个塔借助源柱移到目标住
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-29 12:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表