风百默 发表于 2022-2-26 10:34:38

这个程序是怎么执行的,怎样推出程序输出结果?

本帖最后由 风百默 于 2022-2-27 09:06 编辑

isdkz 发表于 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柱

沐夕... 发表于 2022-2-26 23:30:35

太高深了,目前我好不会{:5_99:}

风百默 发表于 2022-2-27 09:05:33

isdkz 发表于 2022-2-26 10:36
n代表几个圆盘,x代表第一条柱子,y代表第二条柱子,z代表第三条柱子
目的:把所有的圆盘的顺序原封不动地 ...

但我推出的程序结果与实际输出的不同?

isdkz 发表于 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 互换。


风百默 发表于 2022-2-27 12:52:12

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

风百默 发表于 2022-2-27 12:53:36

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

朋友,我这样理解哪里错了吗?我发现这样执行不了

isdkz 发表于 2022-2-27 12:56:36

风百默 发表于 2022-2-27 12:53
朋友,我这样理解哪里错了吗?我发现这样执行不了

理解没错,运行不了是因为你不是传字面量,传了变量,而那个变量你还没有定义

shiyouroc 发表于 2022-2-27 13:52:37

感觉好简单就用了个递归。

风百默 发表于 2022-2-27 20:24:59

isdkz 发表于 2022-2-27 12:56
理解没错,运行不了是因为你不是传字面量,传了变量,而那个变量你还没有定义

那这个程序递归过程中也是直接传变量,为什么它能运行😳?

isdkz 发表于 2022-2-27 20:34:22

本帖最后由 isdkz 于 2022-2-27 20:36 编辑

风百默 发表于 2022-2-27 20:24
那这个程序递归过程中也是直接传变量,为什么它能运行😳?

因为函数里面的变量已经定义了呀,就是传参的时候传进去的,而你的在全局调用你又没有在全局定义那个变量

风百默 发表于 2022-2-27 20:45:14

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

风百默 发表于 2022-2-27 20:45:44

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

那为什么这样还是不行?

isdkz 发表于 2022-2-27 20:51:07

本帖最后由 isdkz 于 2022-2-27 20:56 编辑

风百默 发表于 2022-2-27 20:45
那为什么这样还是不行?

你用默认参数你也没有在全局定义 x, y, z 呀,你在全局调用的时候用的是全局变量给函数传参,你那个应该这样调用hanoi()

风百默 发表于 2022-2-27 21:48:22

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

那上面那个函数在递归时也没有全局定义xyz呀,那不应该改成这样才能执行吗?

isdkz 发表于 2022-2-27 22:05:35

本帖最后由 isdkz 于 2022-2-27 22:08 编辑

风百默 发表于 2022-2-27 21:48
那上面那个函数在递归时也没有全局定义xyz呀,那不应该改成这样才能执行吗?

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

你改成那样递归就没啥意义了,这样的话递归的过程,'x','y','z' 的位置都没有变化

风百默 发表于 2022-2-28 07:46:47

isdkz 发表于 2022-2-27 22:05
在函数里面他用的是函数内部的局部变量呀,传参的时候给他传进去了,

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

谢谢您

风百默 发表于 2022-2-28 07:47:25

isdkz 发表于 2022-2-27 22:05
在函数里面他用的是函数内部的局部变量呀,传参的时候给他传进去了,

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

我懂了
页: [1]
查看完整版本: 这个程序是怎么执行的,怎样推出程序输出结果?