鱼C论坛

 找回密码
 立即注册
查看: 1772|回复: 17

[已解决]这个程序是怎么执行的,怎样推出程序输出结果?

[复制链接]
发表于 2022-2-26 10:34:38 | 显示全部楼层 |阅读模式
5鱼币
本帖最后由 风百默 于 2022-2-27 09:06 编辑

-1b13a17208fcc13.jpg IMG_20220226_103217.jpg
最佳答案
2022-2-26 10:34:39
n代表几个圆盘,x代表第一条柱子,y代表第二条柱子,z代表第三条柱子
目的:把所有的圆盘的顺序原封不动地移动到第三根柱子

如果只有一个圆盘,则直接从第一根柱子移动到第三根柱子,
if n==1:
        print(x,"-->",z)
x 为第二个形参,z为第四个形参,也就是说是由第二个形参移动到第四个形参
如果不只有一个圆盘,则将除最底下的圆盘外的其它圆盘移动到第二根柱子,即y柱,
hanoi(n-1,x,z,y)   # 第二个形参移动到第四个形参,x移动到y
然后将最底下的移动到第三根柱子,即z柱
print(x,"-->",z)
最后将第二根柱子上的圆盘移动到第三根柱子,即y柱移动到z柱,所以此时由y充当第二个形参,z充当第四个形参,因为圆盘数始终充当第一个形参,剩下的那根柱子就是第三个形参了
hanoi(n-1,y,x,z)   # y柱移动到z柱

最佳答案

查看完整内容

n代表几个圆盘,x代表第一条柱子,y代表第二条柱子,z代表第三条柱子 目的:把所有的圆盘的顺序原封不动地移动到第三根柱子 如果只有一个圆盘,则直接从第一根柱子移动到第三根柱子, x 为第二个形参,z为第四个形参,也就是说是由第二个形参移动到第四个形参 如果不只有一个圆盘,则将除最底下的圆盘外的其它圆盘移动到第二根柱子,即y柱, 然后将最底下的移动到第三根柱子,即z柱 最后将第二根柱子上的圆盘移动到 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-2-26 10:34:39 | 显示全部楼层    本楼为最佳答案   
n代表几个圆盘,x代表第一条柱子,y代表第二条柱子,z代表第三条柱子
目的:把所有的圆盘的顺序原封不动地移动到第三根柱子

如果只有一个圆盘,则直接从第一根柱子移动到第三根柱子,
if n==1:
        print(x,"-->",z)
x 为第二个形参,z为第四个形参,也就是说是由第二个形参移动到第四个形参
如果不只有一个圆盘,则将除最底下的圆盘外的其它圆盘移动到第二根柱子,即y柱,
hanoi(n-1,x,z,y)   # 第二个形参移动到第四个形参,x移动到y
然后将最底下的移动到第三根柱子,即z柱
print(x,"-->",z)
最后将第二根柱子上的圆盘移动到第三根柱子,即y柱移动到z柱,所以此时由y充当第二个形参,z充当第四个形参,因为圆盘数始终充当第一个形参,剩下的那根柱子就是第三个形参了
hanoi(n-1,y,x,z)   # y柱移动到z柱
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-2-26 23:30:35 | 显示全部楼层
太高深了,目前我好不会
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-2-27 09:05:33 | 显示全部楼层
isdkz 发表于 2022-2-26 10:36
n代表几个圆盘,x代表第一条柱子,y代表第二条柱子,z代表第三条柱子
目的:把所有的圆盘的顺序原封不动地 ...

但我推出的程序结果与实际输出的不同?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-2-27 09:26:26 | 显示全部楼层
本帖最后由 isdkz 于 2022-2-27 09:28 编辑
风百默 发表于 2022-2-27 09:05
但我推出的程序结果与实际输出的不同?


你就看每个递归的规则,第一个递归 x 不动,把 y 跟 z 的位置互换,直到 n 为 1,你在 n 从 2 到 1 的过程你没有把 y 和 z 互换。

IMG_20220227_092255.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-2-27 12:52:12 | 显示全部楼层
isdkz 发表于 2022-2-27 09:26
你就看每个递归的规则,第一个递归 x 不动,把 y 跟 z 的位置互换,直到 n 为 1,你在 n 从 2 到 1 的 ...

-7661d8db3ee33ac6.jpg 63ed962139315ab5.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-2-27 12:53:36 | 显示全部楼层
isdkz 发表于 2022-2-27 09:26
你就看每个递归的规则,第一个递归 x 不动,把 y 跟 z 的位置互换,直到 n 为 1,你在 n 从 2 到 1 的 ...

朋友,我这样理解哪里错了吗?我发现这样执行不了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-2-27 12:56:36 | 显示全部楼层
风百默 发表于 2022-2-27 12:53
朋友,我这样理解哪里错了吗?我发现这样执行不了

理解没错,运行不了是因为你不是传字面量,传了变量,而那个变量你还没有定义
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-2-27 13:52:37 From FishC Mobile | 显示全部楼层
感觉好简单就用了个递归。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-2-27 20:24:59 | 显示全部楼层
isdkz 发表于 2022-2-27 12:56
理解没错,运行不了是因为你不是传字面量,传了变量,而那个变量你还没有定义

那这个程序递归过程中也是直接传变量,为什么它能运行😳?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-2-27 20:34:22 | 显示全部楼层
本帖最后由 isdkz 于 2022-2-27 20:36 编辑
风百默 发表于 2022-2-27 20:24
那这个程序递归过程中也是直接传变量,为什么它能运行😳?


因为函数里面的变量已经定义了呀,就是传参的时候传进去的,而你的在全局调用你又没有在全局定义那个变量
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-2-27 20:45:14 | 显示全部楼层
isdkz 发表于 2022-2-27 20:34
因为函数里面的变量已经定义了呀,就是传参的时候传进去的,而你的在全局调用你又没有在全局定义那个变 ...

6b9c3d2b570b879.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-2-27 20:45:44 | 显示全部楼层
isdkz 发表于 2022-2-27 20:34
因为函数里面的变量已经定义了呀,就是传参的时候传进去的,而你的在全局调用你又没有在全局定义那个变 ...

那为什么这样还是不行?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-2-27 20:51:07 | 显示全部楼层
本帖最后由 isdkz 于 2022-2-27 20:56 编辑
风百默 发表于 2022-2-27 20:45
那为什么这样还是不行?


你用默认参数你也没有在全局定义 x, y, z 呀,你在全局调用的时候用的是全局变量给函数传参,你那个应该这样调用  hanoi()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-2-27 21:48:22 | 显示全部楼层
isdkz 发表于 2022-2-27 20:51
你用默认参数你也没有在全局定义 x, y, z 呀,你在全局调用的时候用的是全局变量给函数传参,你那个应 ...

那上面那个函数在递归时也没有全局定义xyz呀,那不应该改成这样才能执行吗? -36600fd7f86d103e.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-2-27 22:05:35 | 显示全部楼层
本帖最后由 isdkz 于 2022-2-27 22:08 编辑
风百默 发表于 2022-2-27 21:48
那上面那个函数在递归时也没有全局定义xyz呀,那不应该改成这样才能执行吗?


在函数里面他用的是函数内部的局部变量呀,传参的时候给他传进去了,

你改成那样递归就没啥意义了,这样的话递归的过程,'x','y','z' 的位置都没有变化
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-2-28 07:46:47 | 显示全部楼层
isdkz 发表于 2022-2-27 22:05
在函数里面他用的是函数内部的局部变量呀,传参的时候给他传进去了,

你改成那样递归就没啥意义了, ...

谢谢您
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-2-28 07:47:25 | 显示全部楼层
isdkz 发表于 2022-2-27 22:05
在函数里面他用的是函数内部的局部变量呀,传参的时候给他传进去了,

你改成那样递归就没啥意义了, ...

我懂了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-12 04:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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