汉诺塔代码求解
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 当中的代码 是如何将abc进行移动的,不太明白
另外还想问一下,在递归时,比如这个,
move(n-1, a, c, b)
move(1, a, b, c)
move(n-1, b, a, c)
是n=某个值的时候自上而下跑一遍,还是说在第一行就跑到n=1的结果后再继续往下进行呢?
求各位大佬指点,谢谢{:5_110:} 首先四个参数
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
给个连接,以前写的:戳我前进 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(),还请高手再解惑一下,十分感谢! 逃兵 发表于 2020-11-24 16:16
首先四个参数
您好,首先表示十分感谢,再看了您和另一高手的的解答后,基本原理已经掌握,但唯一不明白的点是
move(n-1, a, c, b) ,这是如何看出将a移动到中间位置b的(单从函数的角度来看,感觉很难理解,本人是将n=3带入算过,的确通过该函数能达到效果,现在的疑惑点在于,“如果汉诺塔有多层,我们需要将n-1层汉诺塔从起始位置a移动到中间位置b”这样的模型转换成a c b这样的代码的过程无法理解)
还希望您能再次解惑,谢谢! 形参实参了解下 move函数定义时候a是起始位置,b是空闲位置,c是目标位置
move(n-1,a,c,b)是调用函数
将n-1层从a移动到b,这里a,b只是标签,为了输出print 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时),才知道有多少个娃 逃兵 发表于 2020-11-25 09:19
嗯。。在定义函数时,我之前说的不够严谨
这四个参数,第一个位置是汉诺塔层数,第二个参数是起始位置 ...
是怎么看出a b c 就是起始位置 和终点位置的呢? 这是个固定的算法吗? 给我的感觉应该是个建模的过程,现在对这个建模转换的过程没想明白,可能我表述 的不是很清楚,更直白的说就是为啥要这样写呢?{:5_94:} a b c 是怎么代表的3根柱子,为什么进了函数以后就会进行调换了,{:5_94:} 实在没想明白
页:
[1]