鱼C论坛

 找回密码
 立即注册
查看: 1565|回复: 2

[已解决]汉诺塔

[复制链接]
发表于 2020-8-2 17:28:50 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
def hanota(n,x='x',y='y',z='z'):
    if n == 1:
        print(x,'--->',z)
    else:
        hanota(n-1,x,z,y)#将前n-1个盘子从x移到y上
        print(x,'-->',z)#将底下的最后一个盘子从x移到z
        hanota(n-1,y,x,z)#将y的n-1个盘子移到z上
hanota(3)





这些递归def hanota(3,x='x',y='y',z='z'): 中x,y,z都只是形参,进入递归时 hanota(2,x,z,y),此时实参n=n-1=2,x=x, y=z, z=y的!!!不等于1,进入else,分成3枝(分支1:hannota(2,x,z,y),分支2:print(x,'-->',z),
分支3:hanota(2,y,x,z))
分枝1先运行即:hanota(2,x,z,y),递归不等于1,又分成3枝(1子枝1:hanota(1,x,y,z),
1子枝2:print(x,'-->',y); 1子枝3:hanota(1,z,x,y))
1子枝1先运行:1==1;第一次打印print(x,'-->',z)
1子枝2运行:print(x,'-->',y),第二次打印print(x,'-->',y)
1子枝3运行:hanota(1,z,x,y),1==1,第三次打印print(z,'-->',y)




看了一篇文章还是没懂,递归hanota(2,x,z,y)的时候为什么hanota(1,x,y,z)   怎么变成了x,y,z   1子支变为了hanota(1,z,x,y)  同理  请大佬指教,看懵了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-2 17:35:17 | 显示全部楼层    本楼为最佳答案   
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-2 18:00:21 | 显示全部楼层
zltzlt 发表于 2020-8-2 17:35
请见:https://fishc.com.cn/forum.php?mod=viewthread&tid=126371

大佬请假一下他从代码里面的怎们变成了x,y,z  吗?PS:1定义的函数中的n,x,y,z都只是形参,运行函数以及运行中递归调用时给的参数是实参,不要被一会儿x,一会儿y,一会儿z的弄混了,实参是实参,形参中x可以被赋值上实参x,y,z,即变成hanota(2,x=x,y=z,z=y)等。

1子枝1再次递归 hanota(1)时,这时的实参是n=1,x=x,y=z=y(因为hanota(2)中换了一次,这次又换回来了),z=y=z(第二次中z变成y了,这时又换回来了),因而实参成了
x=x,y=y,z=z, 1 == 1,即第一次的打印print(x,'-->',z),此时x即为x,z即为z。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-11 10:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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