为了账号安全,请及时绑定邮箱和手机立即绑定

完全没看懂A-->C的这步在程序里是怎么体现的

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

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

我试了好几个N值,不明白为什么A-->B之后输出的是A-->C

正在回答

5 回答


def move(n,a,b,c):  //这里是函数的定义部分,有四个形参,分别对应圆盘个数,a位置的圆盘名字,b位置的圆盘名字,c位置的圆盘名字它可以不是A,也可是A,后面两个同理

if n==1:  //判断n的值是否符合,符合才执行

    print a,'-->',c//将a位置的圆盘名字和c位置的圆盘名字输出

    return //返回值为空,不加返回内存会溢出,程序不停止而超时

move (n-1,a,c,b)//这里函数调用自身,你可能会疑惑它要怎样输出,但你现在先要进入这个函数的运算,才能执行下一步,然后它就会反复判断,一直到n=1,这时候你的move(2,a,b,c)递归是这样子滴,

/*    def move(2,a,b,c):

            if n==1:

                    print a,'-->',c

                    return

             move(1,a,c,b)

             print a,'-->',c

             move(1,b,a,c)

*/

而你要清楚n=1,函数值return none,释放内存,程序终止不再执行后面语句,所以move(1,a,c,b)函数输出为

A-->B,接着在move(2,a,b,c)函数体中,接着print a,'-->',c执行语句,输出为A--C,再接着move(1,b,a,c),有输出为B-->C,此时move(2,a,b,c)语句结束。

为什么我会说是语句呢?别忘了,这个move(2,a,b,c)只是在move(3,a,c,b)“函数体”中的一个语句而已,既然move(2,a,b,c)语句结束,那后面接着print a,'-->',c执行语句,注意此时的函数体为move(3,a,c,b),所以输出为A-->B,后面接着move(2,c,a,b)语句,输出的方法和前面move(2,a,b,c)相同,但结果不同。

所以,如果要理解递归,你要抽丝剥茧,找到循环终止的位置,从终止的位置出发,一直到你开始的地方,结合后面图片,理解应该更好点。

讲的不好,请见谅。

图片略大,上传不了,有心想学会递归的人可以移步网盘,不难。

链接为https://pan.baidu.com/s/1tSxvKxeC9qxZdb7vWlKI7Q,无密码。


3 回复 有任何疑惑可以回复我~
#1

弹指一挥丶

请教下def move(2,a,b,c):里面两个print是怎么print出来3行结果呢?最后一个print后的move(n-1,b,a,c)是怎么循环的呢?
2018-08-03 回复 有任何疑惑可以回复我~
#2

sunny超1 回复 弹指一挥丶

回答里都说明了,你可以看看图片。
2018-08-03 回复 有任何疑惑可以回复我~
#3

弹指一挥丶 回复 sunny超1

就是不太明白里面2个print怎么打印出3行结果的?还有最后一行代码move(n-1,b,a,c)在里面有什么作用呢?
2018-08-06 回复 有任何疑惑可以回复我~
#4

Sumh

“接着在move(2,a,b,c)函数体中,接着print a,'-->',c执行语句,输出为A--C,再接着move(1,b,a,c),有输出为B-->C,此时move(2,a,b,c)语句结束。”不太懂,这个执行的顺序,这个函数体的执行顺序,为啥是这样的呀?
2018-08-17 回复 有任何疑惑可以回复我~
#5

sunny超1 回复 Sumh

后面有解释…
2018-08-17 回复 有任何疑惑可以回复我~
查看2条回复

下面是步骤https://img1.sycdn.imooc.com//5b3b2463000168cc04600190.jpghttps://img1.sycdn.imooc.com//5b3b2465000168cc04600190.jpg

0 回复 有任何疑惑可以回复我~
#1

大臉貓 提问者

能解释下这个函数的返回顺序吗? A --> C A --> B C --> B A --> C B --> A B --> C A --> C
2018-07-04 回复 有任何疑惑可以回复我~
#2

慕婉清9415352 回复 大臉貓 提问者

假设A柱子上从上到下有1,2,3三个圆盘,首先将1移到C,将2移到B,然后将1从C移到B,B此时有1,2两个圆盘,A有3一个圆盘,C没有圆盘。将3从A移到C,将1从B移到A,将2从B移到C,此时A有1一个圆盘,B无圆盘,C有2,3两个圆盘。最后将1从A移到C,C有1,2,3三个圆盘。
2018-07-09 回复 有任何疑惑可以回复我~

https://img1.sycdn.imooc.com//5b3b18820001ea1702950182.jpg这里A-->C

0 回复 有任何疑惑可以回复我~
#1

大臉貓 提问者

我还有个问题能否解答下,这个函数在运行的时候,是否是先把字符A,B,C赋予到了最初的形参a,b,c上再开始调用递归的?还是先调用递归,最后再赋值
2018-07-03 回复 有任何疑惑可以回复我~

额,都解释的这么清楚了。。。https://img1.sycdn.imooc.com//5b3b18420001c27c03270190.jpg

0 回复 有任何疑惑可以回复我~

因为汉诺塔游戏是有A,B,C三根带圆盘底座的柱子,假设A上有从上到下依次排列的3个圆盘,上面的最小,下面的最大。根据汉诺塔规则,一次必须移动一个且小的那个永远在最上面。所以先从A中拿取相对最小的一个放在B上,即A--->B,此时A上还有2个,再一次移动A上相对小的一个,此时根据规则大的总在小的下面,所以只能是移动到C,即A--->C

0 回复 有任何疑惑可以回复我~
#1

大臉貓 提问者

我是在问程序里面哪一条语句可以打印出A-->C啊。。。不是问游戏该怎么玩。
2018-07-03 回复 有任何疑惑可以回复我~
#2

大臉貓 提问者

错了,是哪条语句可以在A--B后面打印出A--C
2018-07-03 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
初识Python
  • 参与学习       758621    人
  • 解答问题       8667    个

学python入门视频教程,让你快速入门并能编写简单的Python程序

进入课程

完全没看懂A-->C的这步在程序里是怎么体现的

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信