不是很懂其中的过程
执行的结果为什么是下面这样?
A --> B
A --> C
B --> C
A --> B
C --> A
C --> B
A --> B
A --> C
B --> C
B --> A
C --> A
B --> C
A --> B
A --> C
B --> C
执行的结果为什么是下面这样?
A --> B
A --> C
B --> C
A --> B
C --> A
C --> B
A --> B
A --> C
B --> C
B --> A
C --> A
B --> C
A --> B
A --> C
B --> C
2018-07-14
那好,我就讲输出的顺序了,这个递归函数你要明白,只有if条件满足时,才会输出,而满足条件的唯一条件时n=1,让n=1的函数只能是move(1,a,c,b)和move(1,b,a,c),这两个怎么来的,从第一个move(4,a,b,c)推导就知道了,当满足了第一个move(1,a,c,b),你就可以按照定义的函数执行语句顺序来了,接着print a,'-->',c,注意这里a和c只是把a和c位置上的数输出,不是a与c。再接着move(1,b,a,c),然后这个时候你要意识到,你只是完成了move(2,a,b,c)的输出,接着在move(3,```,```,```)这个函数体内,你有接着像move(1)一样输出move(2)了。后面其他也是这样。
/*下个回答附上图片*/
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)相同,但结果不同。
所以,如果要理解递归,你要抽丝剥茧,找到循环终止的位置,从终止的位置出发,一直到你开始的地方,结合后面图片,理解应该更好点。
讲的不好,请见谅。
举报