鱼C论坛

 找回密码
 立即注册
查看: 2039|回复: 8

汉诺塔代码求解

[复制链接]
发表于 2020-11-24 16:03:55 | 显示全部楼层 |阅读模式

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

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

x
def move(n, a, b, c):
    if n == 1:
        print('move', a, '-->', c)
    else:
        move(n-1, a, c, b)   
        move(1, a, b, c)
        move(n-1, b, a, c)

move(4, 'A', 'B', 'C')

各位大神,想请问一下else 当中的代码 是如何将a  b  c  进行移动的,不太明白
另外还想问一下,在递归时,比如这个,
  move(n-1, a, c, b)   
  move(1, a, b, c)
  move(n-1, b, a, c)
是n=某个值的时候自上而下跑一遍,还是说在第一行就跑到n=1的结果后再继续往下进行呢?

求各位大佬指点,谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-11-24 16:16:02 | 显示全部楼层
首先四个参数
def move(n, a, b, c)

#n是汉诺塔的层数,a是起始位置,b是中间位置,c是目标位置

#函数的意义就是通过中间层数b将n层汉诺塔从起始位置a移动到目标c
    if n == 1:
        print('move', a, '-->', c)

#如果汉诺塔只有一层,将汉诺塔从起始位置a移动到目标位置c就可以了
    else:
        move(n-1, a, c, b)   
        move(1, a, b, c)
        move(n-1, b, a, c)

#如果汉诺塔有多层,我们需要将n-1层汉诺塔从起始位置a移动到中间位置b
#然后将起始位置a的最底层移动到目标位置c
#再将之前移动的n-1层汉诺塔从起始位置b移动到目标位置c
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-24 16:31:42 | 显示全部楼层
给个连接,以前写的:戳我前进
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-25 00:06:26 | 显示全部楼层
heidern0612 发表于 2020-11-24 16:31
给个连接,以前写的:戳我前进

你好,看了您的笔记,基本理解原理,但现在还有一个知识点没明白,就是
move(n-1,a,c,b)  和 move(n-1,b,a,c)
他们的写法当中有一事不明, a c b 怎么就能表示要从 a移动到b呢?我也看了您给出的流程图,按照图示来说的话整个逻辑没问题,但当n足够大时,自己并不能推导出这么一个流程图
如果按照上面的写法表面来看的话,给我的感觉就是在做b c的交叉轮流赋值后进入函数运算,计算到n=1是 输出一个print(),还请高手再解惑一下,十分感谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-25 00:11:58 | 显示全部楼层

您好,首先表示十分感谢,再看了您和另一高手的的解答后,基本原理已经掌握,但唯一不明白的点是
move(n-1, a, c, b)   ,这是如何看出将a移动到中间位置b的(单从函数的角度来看,感觉很难理解,本人是将n=3带入算过,的确通过该函数能达到效果,现在的疑惑点在于,“如果汉诺塔有多层,我们需要将n-1层汉诺塔从起始位置a移动到中间位置b”这样的模型转换成a c b这样的代码的过程无法理解)
还希望您能再次解惑,谢谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-25 07:49:41 From FishC Mobile | 显示全部楼层
形参实参了解下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-25 07:56:31 From FishC Mobile | 显示全部楼层
move函数定义时候a是起始位置,b是空闲位置,c是目标位置
move(n-1,a,c,b)是调用函数
将n-1层从a移动到b,这里a,b只是标签,为了输出print
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-25 09:19:00 | 显示全部楼层
ggn871107 发表于 2020-11-25 00:11
您好,首先表示十分感谢,再看了您和另一高手的的解答后,基本原理已经掌握,但唯一不明白的点是
move(n ...

嗯。。在定义函数时,我之前说的不够严谨
def move(n, a, b, c)
这四个参数,第一个位置是汉诺塔层数,第二个参数是起始位置,第三个参数是中间位置,第四个参数是结束位置
abc这三个参数代表了三根柱子,你把谁放在第二个位置,谁就是起始位置,谁放在第三个位置,谁就是中间位置,谁放在第四个位置,谁就是结束位置
所以有了
move(n-1,a,c,b)
相当于现在有n-1层,起始位置是a,中间位置是c,我们把它移动到最终位置b
move(1,a,b,c)
这相当于将a下面的最后一层也就是最大的那一块,放在c上
这时候我们的汉诺塔就成了a空,b有n-1层,c有1层最大的
然后调用
move(n-1,b,a,c)
将b上面的n-1层,通过中间层a,移动到c上


递归是层层递归的
就像俄罗斯套娃一样,解到最下面(n==1时),才知道有多少个娃
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-25 14:53:30 | 显示全部楼层
逃兵 发表于 2020-11-25 09:19
嗯。。在定义函数时,我之前说的不够严谨

这四个参数,第一个位置是汉诺塔层数,第二个参数是起始位置 ...

是怎么看出a b c 就是起始位置 和终点位置的呢? 这是个固定的算法吗? 给我的感觉应该是个建模的过程,现在对这个建模转换的过程没想明白,可能我表述 的不是很清楚,更直白的说  就是为啥要这样写呢? a b c 是怎么代表的3根柱子,为什么进了函数以后就会进行调换了, 实在没想明白
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-17 07:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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