鱼C论坛

 找回密码
 立即注册
查看: 768|回复: 3

不明白输出结果的执行

[复制链接]
发表于 2018-11-24 17:24:18 | 显示全部楼层 |阅读模式

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

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

x
def hanoi(n,x,y,z):
        if n==1:
                print(x,"-->",z)
        else:
                hanoi(n-1,x,z,y) #将前n-1个盘子从x移动到Y上
                print(x,"-->",z)  #将最底下的第64个盘子移动到z上
                hanoi(n-1,y,x,z) #将y上的n-1个盘子移动到z上
为什么else 下面的只有第64个盘子移动是print 输出,其他两行只用hanoi()就行,
并且第64个盘子移动只用写X-->Y,而前n-1个盘子移动得用hanoi(n-1,x,z,y)这种形式

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-11-24 18:00:34 | 显示全部楼层
这是一个典型的递归
1.当n==1,直接移
2.当n!=1, hanoi(n-1,x,z,y) #调用hanno函数,将盘子数量改为n-1,将n-1个盘子通过z从x移到y
3.               print(x,"-->",z)  #调用hanno(n-1)结束后,即已经将n-1个盘子移到y,这时x只剩一个盘子,此盘子移到z
4.                hanoi(n-1,y,x,z) #2中将n-1个盘子移动到y做一个中转,3把x最大一个盘子移到z,此时,z中有一个最大的盘子,这个盘子以后都不会动,所以可以看作和z合体。这样
                                          问题就转化为将剩下n-1个盘子从y通过x移动到z,即4
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-24 19:51:21 | 显示全部楼层
本帖最后由 heidern0612 于 2018-11-24 19:58 编辑

这个只是打个比喻而已,并不是指定就是64个盘子移动。

简单说,递归就是三个步骤:  

A、假如你承包的是最后那个大盘子,你只需要:

        1、等人把前面一大坨盘子借助C柱移动到B柱;

        2、把下面最大的那个盘子移动到C柱;

        3、等人把前面一大坨盘子借助A柱移动到C柱,完成。

        至于前面那一大驼盘子怎么移,不是你考虑的事。

B、假如你承包的是倒数第二个大盘子,你只需要:

        1、等人把你前面倒数第二个大盘子以上的一坨借助C柱移动到B柱;

        2、把倒数第二个大盘子移动到C柱;

        3、等人把前面倒数第二个大盘子以上的那一坨借助A柱移动到C柱,完成。

        至于你上面那一大驼盘子怎么移,不是你考虑的事。


以下类推……

也就是说,你只需要考虑你当前需要执行的那一层,不需要考虑别的层怎么执行。

你写好了最初那一层怎么做(递归的归),最后那层怎么做(递归的递),中间的让计算机帮你执行就行。

你简单的只需要声明就可以。


如果你还是不太明白,建议你看看我写的这个心得。  戳我前进
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-25 13:59:15 | 显示全部楼层
heidern0612 发表于 2018-11-24 19:51
这个只是打个比喻而已,并不是指定就是64个盘子移动。

简单说,递归就是三个步骤:  

谢谢,看明白点了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-9 17:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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