鱼C论坛

 找回密码
 立即注册
查看: 1705|回复: 13

[已解决]第24讲汉诺塔,原理懂,但是代码理解不了

[复制链接]
发表于 2017-10-18 16:02:54 | 显示全部楼层 |阅读模式

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

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

x
第24讲汉诺塔,解开游戏的原理明白了,但是代码看不懂啊,有没有大神帮助解决一下
最佳答案
2017-10-18 22:39:05
Z同学 发表于 2017-10-18 21:31
我认为程序应该从头到尾执行完在进行第二次运算,应该是先把else后面的第一个函数在执行完,然后在执行下 ...

递归的执行顺序是先递进到最后一个函数,以n=3为例,先递进到n-1,看n是否等于1,不等于,再次递进直到n=1,执行完,再回归到n。

就是图中画方框的代码,理解不了。求高手解答

就是图中画方框的代码,理解不了。求高手解答
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-10-18 16:32:02 | 显示全部楼层
对递归的理解。你看一下红色框里的代码会发生什么是不是重新执行了这个函数。吧顺序理清楚就明白了。实在不行就一步一步把发生了什么写下来,会好理解很多。我也经历过你这种迷茫。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-18 17:12:01 | 显示全部楼层
汉诺塔的核心在于:
对于x, y,  z三个柱子,将某一个上的移动到另外一个上面的过程会借助第三个柱子

可以看看小甲鱼老师在讲C语言的时候对汉诺塔的详尽分析
http://bbs.fishc.com/forum.php?m ... peid%26typeid%3D584
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-18 17:13:34 | 显示全部楼层
对着程序结果,玩一下游戏,就知道了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-18 17:18:55 | 显示全部楼层
走下流程。。。 红色框中 x, y,  z  的位置交换了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-18 18:19:14 | 显示全部楼层
既然原理明白了,那也就是说对于递归求解没有异议。
代码看不懂,肯定是对于在递归的时候(x,y,z)三个参数为什么会变来变去是吧?
通俗一点解释:
1、首先是hanoi(n,x,y,z)函数本身,这里应该没有疑问吧:传入4个参数,n表示有几个金片(也就是几层),x,y,z代表三根柱子的名字。

2、if n == 1  那么好办,直接从x柱子移动到z柱子上去就ok啦...所以,print(x "----->" y)

3、否则(就表示不止1个要移动)
          |---  那么首先要把 n - 1个金片借助z柱子,从x柱子移动到y柱子上去
                 所以,参数的顺序就是(n-1,x,z,y);所以:print(x "---->"z)

          |---最后就是继续上面一步中把暂存在y柱子上的n-1个金片,借助x柱子移动到z
               所以参数的顺序就是(n-1,y,x,z)

不知道这样解释,你能不能理解代码的含义。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-10-18 21:29:28 | 显示全部楼层
colinshi 发表于 2017-10-18 16:32
对递归的理解。你看一下红色框里的代码会发生什么是不是重新执行了这个函数。吧顺序理清楚就明白了。实在不 ...

嗯,就是没有理解到,红色线框里面的程序需要在重新执行才可以。理解了这步,下面的也就理解了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-10-18 21:30:07 | 显示全部楼层
BngThea 发表于 2017-10-18 17:12
汉诺塔的核心在于:
对于x, y,  z三个柱子,将某一个上的移动到另外一个上面的过程会借助第三个柱子

谢谢谢谢。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-10-18 21:31:48 | 显示全部楼层
铁棍阿童木 发表于 2017-10-18 18:19
既然原理明白了,那也就是说对于递归求解没有异议。
代码看不懂,肯定是对于在递归的时候(x,y,z)三个 ...

我认为程序应该从头到尾执行完在进行第二次运算,应该是先把else后面的第一个函数在执行完,然后在执行下面的函数。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-18 22:39:05 | 显示全部楼层    本楼为最佳答案   
Z同学 发表于 2017-10-18 21:31
我认为程序应该从头到尾执行完在进行第二次运算,应该是先把else后面的第一个函数在执行完,然后在执行下 ...

递归的执行顺序是先递进到最后一个函数,以n=3为例,先递进到n-1,看n是否等于1,不等于,再次递进直到n=1,执行完,再回归到n。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-10-19 12:30:59 | 显示全部楼层
铁棍阿童木 发表于 2017-10-18 22:39
递归的执行顺序是先递进到最后一个函数,以n=3为例,先递进到n-1,看n是否等于1,不等于,再次递进直到n= ...

嗯嗯,懂了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-14 08:31:55 | 显示全部楼层
理解一下运行过程,会有帮助。
汉诺塔运行过程.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2017-11-14 17:44:16 | 显示全部楼层
payton24 发表于 2017-11-14 08:31
理解一下运行过程,会有帮助。

谢谢谢谢!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-8 22:01:01 | 显示全部楼层
payton24 发表于 2017-11-14 08:31
理解一下运行过程,会有帮助。

if==1的时候pint(x,'-->',z),在这里程序不是已经结束了吗?怎么接下来还可以print(x,'-->',z)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-24 01:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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