python遞歸函數的執行過程


舉例:

def nove(n,a,b,c):

  if n == 1:
    print(a,'------------>',c)
  else:
    nove(n-1,a,c,b)
    nove(1,a,b,c)
    nove(n-1,b,a,c)

 

執行輸出結果:

 nove(3, 'A', 'B', 'C')

# A --> C
# A --> B
# C --> B
# A --> C
# B --> A
# B --> C
# A --> C

執行過程詳解:

1 def nove(n, a='A', b='B', c='C'):

2 if n == 1:

3 return print(a, "->", c)

4 else:

5 nove((n-1), a, c, b)

6 print(a, "->", c)

7 nove((n-1), b, a, c)

8

9 nove(3)

第6行print(a, "->", c)可以寫做nove(1, a, b, c),個人感覺可以不用這么寫,print(a, "->", c)這樣可以讓代碼少跑兩步。

開始運行nove( 3 )

nove 函數代入 ‘ 行9’ ( n = 3 )參數 (3, a='A', b='B', c='C')

第一步 執行 ‘行2 - 3’ if n == 1:......

n != 1 , ‘行2 - 3’越過

第二步 執行 ‘行4’else:

執行 ‘行5’, 第一次遞歸開始,((n-1), a, c, b)回到函數最初代入(3, a='A', b='B', c='C'),得出參數為(2, 'A', 'C', 'B'),【!注意: 此時‘行1 ’(3, a='A', b='B', c='C')在 ‘行5’ 遞歸回到函數最初運行后已改變為(2, a='A', b='C', c='B')

執行 ‘行2 - 3’ ,n != 1 , ‘行2 - 3’ 越過

      • 執行else:
        • 執行 ‘行5’,將((n-1), a, c, b)代入(2, a='A', b='C', c='B'),得出參數為(1, 'A', 'B', 'C') ,繼續執行 ‘行2 - 3’,n == 1 返回輸出:(a, "->", c)代入(1, 'A', 'B', 'C'),即 A -> C
        • 回到 ’ 行5‘,繼續執行 ‘行6’ ,將(a, "->", c)代入nove函數(2, a='A', b='C', c='B')並輸出,即A -> B
        • 執行 ’行7‘,將( (n-1), b, a, c)代入(2, a='A', b='C', c='B')得出參數為(1, 'C', 'A', 'B'),繼續執行 ‘行2 - 3’,n == 1 返回輸出:(a, "->", c)代入(1, 'C', 'A', 'B'),即 C -> B
  • 第三步 執行 ‘行6’ print(a, "->", c)

  • (a, "->", c)代入nove函數(3, a='A', b='B', c='C')並輸出,即A -> C
  • 第四步 執行 ’行7‘ nove((n-1), b, a, c)

  • 執行 ‘ 行7’ ,第二次遞歸開始,((n-1), b, a, c)代入(3, a='A', b='B', c='C')得出參數為(2, 'B', 'A', 'C')【!注意: 此時 ‘行1 ’ (3, a='A', b='B', c='C')在 ‘行7’ 遞歸回到函數最初運行后已改變為(2, a='B', b='A', c='C')
    • 執行 ‘行2 - 3’ ,n != 1 , ‘行2 - 3’ 越過
      • 執行else:
        • 執行 ‘行5’,將((n-1), a, c, b)代入(2, a='B', b='A', c='C')得出參數為(1, 'B', 'C', 'A'),繼續執行‘行2 - 3’,n == 1 返回輸出:(a, "->", c)代入(1, 'B', 'C', 'A') ,即 B -> A
        • 回到 ’ 行5‘,繼續執行 ‘行6’ ,將(a, "->", c)代入nove函數(2, a='B', b='A', c='C')並輸出,即B -> C
        • 執行 ’行7‘,將((n-1), b, a, c)代入(2, a='B', b='A', c='C')得出參數為(1, 'A', 'B', 'C'),繼續執行 ‘行2 - 3’,n == 1 返回輸出:(a, "->", c)代入(1, 'A', 'B', 'C') ,即 A -> C
        • 代碼運行結束,輸出結果為:

          A -> C A -> B C -> B A -> C B -> A B -> C A -> C


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM