2017-02-13 47 views
3

我很困惑與下面的代碼。
如何在Python中的遞歸函數中存儲和處理變量?

def a(x): 
    print(x)  
    if x > 0: 
     a(x - 1) 
    print(x) #I am confused with this print statement 

a(5) 

上面的代碼輸出:

5 
4 
3 
2 
1 
0 
0 
1 
2 
3 
4 
5 

至本0我明白它是如何打印,但爲什麼它在升序打印。
變量x正在改變,所以我認爲輸出將是最後指定的值x0
我預測的輸出:

5 
4 
3 
2 
1 
0 
0 
0 
0 
0 
0 
0 

那麼它是怎樣軌道 x的值...?
有人可以在簡要說明什麼遞歸函數變量存儲在其中。

+0

沒有變量'x'沒有改變:每個函數調用都有自己的'x'。 –

+1

這與遞歸函數無關。用'x - 1'調用一個函數並不會改變當前範圍內'x'的值。你可能會發現http://pythontutor.com/很有用。 – jonrsharpe

+1

看起來像你應該讀一點關於堆棧,例如這裏:https://www.cs.umd.edu/class/sum2003/cmsc311/Notes/Mips/stack.html - 這是如何函數存儲他們的局部變量,返回值等 –

回答

6

您必須明白,對於每個函數調用,x是本地。所以這意味着第二次致電f有不同的x。爲直觀:你可以看到它像:

f(x=5) 
    print(x) # this x = 5 
    f(x=4) 
     print(x) # this x = 4 
     f(x=3) 
      print(x) # this x = 3 
      f(x=2) 
       print(x) # this x = 2 
       f(x=1) 
        print(x) # this x = 1 
        f(x=0) 
         print(x) # this x = 0 
         print(x) # this x = 0 
        print(x) # this x = 1 
       print(x) # this x = 2 
      print(x) # this x = 3 
     print(x) # this x = 4 
    print(x) # this x = 5 

所以在你的遞歸調用,有六個x ES。每個x變量可以有不同的值,並改變他們更深一層的對上述水平沒有影響等

+0

top answer dude :) – WhatsThePoint

4

對於每個調用,函數創建新的變量x並打印的x中的對應值它被稱爲。

因此,每次調用該函數時,都會創建該函數的新副本,並在該範圍內創建x的值。所以你實際上是用相應的價值創造出六個x。

3

調用a(5)將啓動功能a()x = 5。這將做三兩件事:

  1. 首頁打印X(這是值5)
  2. 然後調用a(4)
  3. 然後(後一切),然後重新打印X(這是價值5仍)。

第2步恰好有點複雜,因爲它也會執行這三個步驟(打印「4」兩次,並在中間調用a(3))。這將下降,直到a(0)被調用,它將只打印0兩次,但不會再打電話a()

2

讓我試着解釋。一個(4),一個(3),一個(2)和一個(1)遞歸調用,因爲它們落入if語句中,所以在堆棧中,(5)位於底部,並且(1)位於頂部的,因爲它們被堆疊自下而上

def a(x): 
    print(x) # executed  
    if x > 0: 
     a(x - 1) #executed 
    print(x)  

結果:5,4,3,2,1

當(0)被調用時,它不會落入if語句因此它打印0兩次。只有一個(0)被執行完成,(1)到(5)還沒有完成執行,因爲它們仍然在堆棧中。

def a(x): 
    print(x) #executed 
    if x > 0: 
     a(x - 1) 
    print(x) #executed 

結果:0,0

我們如何執行完這些函數調用?我們必須將它們從堆棧中彈出。回想一下,我提到(5)在底部,(1)在頂部。堆棧從上到下彈出,因此當(0)返回時,它會調用(1)和(1)完成其最後一條語句的執行。 (1)彈出後,(2)被調用,等等。

def a(x): 
    print(x)  
    if x > 0: 
     a(x - 1) 
    print(x) #executed 

結果:1,2,3,4,5

堆棧現已全面彈出。

1

這與堆棧有關。
對於每次調用,都會創建一個不同的x,因此x的值將按照升序排列。