2012-10-26 111 views
2

這是我的函數foo:如何計算python遞歸深度?

def Foo(n=10): 
    if 1<n<=10: 
     for i in range(1, 10): 
      #### Do_Something 
      Foo(n-1) 

我得到RuntimeError: maximum recursion depth exceeded,這是令人沮喪的,因爲我期待Foo的遞歸深度是10+,遠不及python的默認500個限制。 我知道我會用這個Foo獲得大量的堆棧,但這是可以忍受的。我試圖增加sys.setrecursionlimit,但仍然收到RuntimeError錯誤。有什麼建議麼?

+3

無法重現 - 我讓它執行得很好。堆棧深度最大值爲10. –

+0

什麼使得您認爲最大深度爲10-ish? – kindall

+0

@ kindall,因爲如果n <= 10,Foo(n)只會調用Foo(n-1)。 – sloth

回答

3

sys.setrecursionlimitdocumentation指定遞歸限制實際上是python堆棧的深度。

EDIT我不知道你爲什麼要達到遞歸限制,但是你可能沒有打這個函數(我已經修改了它,以便它打印堆棧的最大時間):

count = 0 
maxcount = 0 

def Foo(n=10): 
    global count 
    global maxcount 
    count = count + 1 

    if(count > maxcount): 
     maxcount = count 
     print maxcount 

    if 1<n<=10: 
     for i in range(1, 10): 
      #### Do_Something 
      Foo(n-1) 
    count = count - 1 

Foo(10) 
+0

但是'因數(10)'只有在電話發生「混合」時纔是這種情況。恕我直言,最大深度約爲10(這是如果我嘗試...) – glglgl

+1

@glglgl - 你說得對。這應該不會達到遞歸限制(據我所知)。 – mgilson

-1

我的計算道歉有誤。這個函數實際上並不會在foo(10)上崩潰,而只是產生了40億次調用,但是正確地停止了。

+0

在第一次循環迭代中,其中n = 10,循環將進行以下調用:'Foo(9); FOO(9); FOO(9); FOO(9); FOO(9); FOO(9); FOO(9); FOO(9); FOO(9); FOO(9); ' – Junuxx

+1

是的你是對的,但這使得它更糟 –

+0

我一直在運行富(10)約10分鐘,我們在130000電話,它仍然會 –