2014-09-01 49 views
0

我在做第一個遞歸運動對這個位置:http://cscircles.cemc.uwaterloo.ca/16-recursion/唔明遞歸

我也跟着明顯的提示,並提出這樣的:

def countup(n): 
    if n == 0: 
    print('Blastoff!') 
    else: 
    countup(n - 1) 
    print(n) 

因此,代碼基本上是從0(升空)計數到n。我只是不明白它是如何工作的 - 我看着可視化工具,它通過countup(n)到countup(0),此時它打印出'Blastoff',都很好。在這之後,它有點......停留在else循環中,並開始打印出前n個值。爲什麼它會這樣做。是否由於某種原因存儲了n個值,即使它確實如此代碼機制是如何工作的?任何幫助將不勝感激。非常感謝。

+1

遞歸:看到遞歸* *。 'countup()'函數調用最終返回。無論什麼叫它.. – 2014-09-01 19:11:39

+1

嘗試顛倒'countup(n-1)'和'print(n)'線。調試,看你明白了。然後將其逆轉回去。 – Korem 2014-09-01 19:14:03

+1

我不知道人們爲什麼會倒下。這是一個開始編碼的人的合理問題。這不是一個「做我的作業」類型的問題。 – Pedro 2014-09-01 19:14:37

回答

4

每次調用countup()時,它最終都會返回到它調用的同一點。下一行將打印n,因爲在該函數調用期間它是

而且每次調用某個函數時,都會重新創建它們的所有名稱,它們是本地。因此,每次撥打countup()時,您都有一個本地獨立價值n

基本上你創建的countup()調用鏈:

  • countup(2)n2,不0,所以執行else分支,調用countup(1)

    • countup(1)n1 ,而不是0,所以else分支被執行,調用countup(0)

      • countup(0)n0,打印Blastoff!!和功能在此調用返回


      countup(0)調用返回,下一行打印n,還是1。接下來,該函數返回。

    countup(1)呼叫此調用返回,下一行打印n,還是2。接下來,該函數返回。

+0

不是我投票的人,我認爲你的回答非常有幫助 - 謝謝。 – MathsIsHard 2014-09-01 19:22:09

4

它使用遞歸來打印數字。
明白這一點的最好辦法是通過一個例子:

countup(3) 
    countup(2) 
    countup(1) 
     countup(0) 
     n == 0 
     print('Blastoff!') 
    print (1) 
    print(2) 
print(3) 

每次調用函數時,它卡列斯同樣的功能與n-1,直到n==0。此時,它開始打印數字,如圖所示。

+1

謝謝!這使得它更容易理解,我發現遞歸是非常棘手的哈哈。 – MathsIsHard 2014-09-01 19:22:56

1

考慮變體:

def countup(n): 
    if n == 0: 
    print('Blastoff!') 
    else: 
    print(n, end=', ') 
    countup(n - 1) 
     # print(n, end=', ') reverse 

打印:

5, 4, 3, 2, 1, Blastoff! 

Vs的反向打印順序與遞歸調用:

def countup(n): 
    if n == 0: 
    print('Blastoff!') 
    else: 
     # print(n, end=', ') reverse 
    countup(n - 1) 
    print(n, end=', ') 

打印:

Blastoff! 
1, 2, 3, 4, 5, 

現在您可以看到,在print(n, end=', ')之前遞歸調用countup(n - 1),函數必須在遇到任何打印之前一直到達if n == 0:的最終測試。

一旦符合if n == 0:的條件,則整個呼叫鏈將被解開,並以相反的順序將參數打印到countup

認爲是又一個經典的遞歸例子反轉的字符串:

def rrev(s): 
    if s == "": 
     return s 
    else: 
     return rrev(s[1:]) + s[0] 

或者,更簡潔:

def rrev(s): 
    return rrev(s[1:]) + s[0] if s else s 
+0

是的它現在是有道理的,'上一個'功能並沒有真正終止,所以它回到它離開的地方(在print(n)之前,謝謝。 – MathsIsHard 2014-09-02 09:12:47