函数的每一步到底是怎么执行的?
def move(n, a, b, c): if n ==1: print a, '-->', c return move(n-1, a, c, b) #1 print a, '-->', c move(n-1, b, a, c) move(4, 'A', 'B', 'C')
当执行到1的时候,是再次调用这个函数,还是print a, '-->', c?
接下来又执行哪一步?
2017-12-11
递归函数形式如下:
① move(n,a,b,c)
if→print→return【返回打印,结束递归】
② move(n-1,a,c,b)
print【流程打印】
③ move(n-1,b,a,c)
这时,我们假设n=3,执行步骤如下:
① move(3,A,B,C) 【a=A, b=B, c=C】
② move(2,A,C,B) 【a=A, c=C, b=B】
②① move(2,A,C,B) 【等同于②,a=A, b=C, c=B】
②② move(1,A,B,C) 【a=A, c=B, b=C】
②②① move(1,A,B,C) 【等同于②②,a=A, b=B, c=C】
执行if→print→return 【返回打印,第一行,结束②②递归】
print 【流程打印,第二行,与②①、②②、②③为同一级】
②③ move(1,C,A,B) 【b=C, a=A, c=B】
②③① move(1,C,A,B) 【等同于②③,a=C, b=A, c=B】
执行if→print→return 【返回打印,第三行,结束②③递归】
print 【流程打印,第四行,与①、②、③为同一级】
③ move(2,B,A,C) 【b=B, a=A, c=C】
③① move(2,B,A,C) 【等同于③,a=B, b=A, c=C】
③② move(1,B,C,A) 【a=B, c=C, b=A】
③②① move(1,B,C,A) 【等同于③②,a=B, b=C, c=A】
执行if→print→return 【返回打印,第五行,结束③②递归】
print 【流程打印,第六行,与③①、③②、③③为同一级】
③③ move(1,A,B,C) 【b=A, a=B, c=C】
③③① move(1,A,B,C) 【等同于③③,a=A, b=B, c=C】
执行if→print→return 【返回打印,第七行,结束③③递归,整个函数递归结束!】
具体移动步骤如下:
A --> C
A --> B
C --> B
A --> C
B --> A
B --> C
A --> C
数学公式表示如下:
若圆盘n=3,打印行数为2^0+2^1+2^2=7行;
同理,n=4,打印行数为2^0+2^1+2^2+2^3=15行;
同理,n=5,打印行数为2^0+2^1+2^2+2^3+2^4=31行,以此类推。
(如果有哪里说得不对的地方,可以一起讨论一下)
举报