完全没看懂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
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
2018-07-03
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,无密码。
举报