这个程序是怎么执行的,怎样推出程序输出结果?
本帖最后由 风百默 于 2022-2-27 09:06 编辑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柱
太高深了,目前我好不会{:5_99:}
isdkz 发表于 2022-2-26 10:36
n代表几个圆盘,x代表第一条柱子,y代表第二条柱子,z代表第三条柱子
目的:把所有的圆盘的顺序原封不动地 ...
但我推出的程序结果与实际输出的不同? 本帖最后由 isdkz 于 2022-2-27 09:28 编辑
风百默 发表于 2022-2-27 09:05
但我推出的程序结果与实际输出的不同?
你就看每个递归的规则,第一个递归 x 不动,把 y 跟 z 的位置互换,直到 n 为 1,你在 n 从 2 到 1 的过程你没有把 y 和 z 互换。
isdkz 发表于 2022-2-27 09:26
你就看每个递归的规则,第一个递归 x 不动,把 y 跟 z 的位置互换,直到 n 为 1,你在 n 从 2 到 1 的 ...
isdkz 发表于 2022-2-27 09:26
你就看每个递归的规则,第一个递归 x 不动,把 y 跟 z 的位置互换,直到 n 为 1,你在 n 从 2 到 1 的 ...
朋友,我这样理解哪里错了吗?我发现这样执行不了 风百默 发表于 2022-2-27 12:53
朋友,我这样理解哪里错了吗?我发现这样执行不了
理解没错,运行不了是因为你不是传字面量,传了变量,而那个变量你还没有定义 感觉好简单就用了个递归。 isdkz 发表于 2022-2-27 12:56
理解没错,运行不了是因为你不是传字面量,传了变量,而那个变量你还没有定义
那这个程序递归过程中也是直接传变量,为什么它能运行😳? 本帖最后由 isdkz 于 2022-2-27 20:36 编辑
风百默 发表于 2022-2-27 20:24
那这个程序递归过程中也是直接传变量,为什么它能运行😳?
因为函数里面的变量已经定义了呀,就是传参的时候传进去的,而你的在全局调用你又没有在全局定义那个变量 isdkz 发表于 2022-2-27 20:34
因为函数里面的变量已经定义了呀,就是传参的时候传进去的,而你的在全局调用你又没有在全局定义那个变 ...
isdkz 发表于 2022-2-27 20:34
因为函数里面的变量已经定义了呀,就是传参的时候传进去的,而你的在全局调用你又没有在全局定义那个变 ...
那为什么这样还是不行? 本帖最后由 isdkz 于 2022-2-27 20:56 编辑
风百默 发表于 2022-2-27 20:45
那为什么这样还是不行?
你用默认参数你也没有在全局定义 x, y, z 呀,你在全局调用的时候用的是全局变量给函数传参,你那个应该这样调用hanoi() isdkz 发表于 2022-2-27 20:51
你用默认参数你也没有在全局定义 x, y, z 呀,你在全局调用的时候用的是全局变量给函数传参,你那个应 ...
那上面那个函数在递归时也没有全局定义xyz呀,那不应该改成这样才能执行吗? 本帖最后由 isdkz 于 2022-2-27 22:08 编辑
风百默 发表于 2022-2-27 21:48
那上面那个函数在递归时也没有全局定义xyz呀,那不应该改成这样才能执行吗?
在函数里面他用的是函数内部的局部变量呀,传参的时候给他传进去了,
你改成那样递归就没啥意义了,这样的话递归的过程,'x','y','z' 的位置都没有变化 isdkz 发表于 2022-2-27 22:05
在函数里面他用的是函数内部的局部变量呀,传参的时候给他传进去了,
你改成那样递归就没啥意义了, ...
谢谢您 isdkz 发表于 2022-2-27 22:05
在函数里面他用的是函数内部的局部变量呀,传参的时候给他传进去了,
你改成那样递归就没啥意义了, ...
我懂了
页:
[1]