2014-06-05 109 views
0
def counter(n): 
    if n < 0: 
     return 
    else: 
     print '1st print', n 
     counter(n-1) 
     print '2nd print', n 

print counter(3) 

# 1st print 3 
# 1st print 2 
# 1st print 1 
# 1st print 0 
# 2nd print 0 
# 2nd print 1 
# 2nd print 2 
# 2nd print 3 
# None 

所以在擺弄遞歸函數之後,我意識到了一些很奇怪的東西,我不能完全包裹它。我理解從3到0打印的函數的第一部分,但我不明白從0到3再打印時的第二部分。當n = 0時函數不會停止嗎?Python:遞歸

+3

請注意,您打印'n'兩次 - 一次在遞歸之前,一次*在它之後。一旦完成所有遞歸調用,所有等待遞歸調用的方法都會再次打印'n'(按相反順序)。嘗試用筆和紙自行運行。 –

+0

這是python。請嘗試打算你的代碼,否則它可能毀了一切。我剛剛編輯它。 –

+1

@AbdulFatir謝謝你的縮進修復,但英聯邦英語(「已實現」)是完全可以接受的,不應該被編輯。 – chrylis

回答

8

您的遞歸調用仍會返回到調用它的父函數。 在該範圍內n尚未更改。

即使您繼續從本身調用函數,函數本地仍然是當前幀的本地對象

您的通話遞歸看起來是這樣的:

counter(3): 
    n = 3 
    | 
    | counter(n - 1) 
    | n = 2 
    | | 
    | | counter(n - 1) 
    | | n = 1 
    | | | 
    | | | counter(n - 1) 
    | | | n = 0 
    | | | | 
    | | | return 
    | | | 
    | | n is still 1 here 
    | | return 
    | | 
    | n is still 2 here 
    | return 
    | 
    n is still 3 here 
    return 
+1

+1。 –

+0

不錯,也祝賀達到250k :-)(好,差不多) –

+0

@TimCastelijns:明天,我敢肯定。然後開始。 :-P謝謝! –

1

是,該功能將停止 - 在最後一個級別。但是更高的層次仍然會處理第二個輸出。

讓我給你舉個例子。你住在建築物的第N層,你想要去地面和後面。由於您的建築沒有電梯,你決定跟隨算法:

def godown(n): 
    if n <= 0: # already there 
     print "At the ground level" 
     return 
    print "Going down" 
    godown(n-1) # we moved one floor lower 
    print "Going back up" 

一旦你在一樓,你突然不會忘記,你想回去了。你知道它,即使你在底層(這是終止條件),你回去了。這對計算機來說也是一樣的 - 它不會一起終止所有功能,而只是終止所有功能,並完成前面調用中所有命令的執行。它可以像任何其他函數調用一樣工作:

def bar(): 
    print "inBar" 
    return 

def foo(): 
    print "preBar" 
    bar() 
    print "postBar" 
1

我簡化了你的代碼,但本質上它是相同的。我的答案與第一個人的答案類似,但我不明白他的答案。我改變了這一點。

def counter(n): 
    if n == 0: 
     return 
    else: 
     print ("Hi") 
     counter(n-1) 

     print("Hi again!") 

counter(3) 

遞歸意味着調用已經執行的函數。所以當你做counter(n-1)時,你正在創建另一個計數器函數。目前有2個計數器正在運行。原來的一個停止,直到第二個完成,等等。

def counter(n): #N is 3 here! 
    if n == 0: 
     return 
    else: 
     print ("Hi") 
     counter(n-1) ---------> (NEW FUNCTION) def counter(2): 
                print("Hi") 
                counter (n-1) ---------> (NEW FUNCTION)def counter(1): 
                           print("Hi") 
                           counter(n - 1) ---------> NEW FUNCTION def counter(0) 
                                      #function returns and ends 
                                      | 
                           (program still running)      | 
                                      | 
                           print ("Hi again")    <------------- 
                             | 
               (program still running)   <--------------------|    

               print("Hi again") 
                 | 
(program still running)     <------------| 

    print("Hi again!")