函數的每一步到底是怎么執行的?
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
舉報
2017-12-13
遞歸函數形式如下:
① 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行,以此類推。
(如果有哪里說得不對的地方,可以一起討論一下)
2017-12-11
當n==1時,執行print?a,?'-->',?c然后執行return,此子函數結束;一層層執行,直到遞歸結束