关于汉诺塔的问题
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')
不懂原理以及层数与参数是如何联系在一起的
规则是一次只能移动一个,递归是如何实现的 本帖最后由 N781791878 于 2022-8-3 19:08 编辑
看一下这样能不能理解:
hanoi(n,x,y,z)
==
hanoi(层数,圆盘所在的柱子,需要借助的柱子,目标柱子){:10_254:}=======>就是不要看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') 如果把这个递归函数的形参名称改的清晰一些可能就更容易理解了。实际上应该是
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 行所做的事情。 https://fishc.com.cn/forum.php?mod=viewthread&tid=167696&ctid=1730 要把N个塔从A移到C,就得把N-1个塔移到B,再把最后一个塔从A移到C,再把N-1个盘挪到C
借助了B,B就是过度住;
那么现在已经知道了过程
函数就是:
1.如果要移一个,直接从源柱移到目标柱
2.把N-1个柱移从源柱移到过度住
3.把剩下一个塔移到目标住
4.把过度柱上的N-1个塔借助源柱移到目标住
页:
[1]