2013-03-15 49 views
0

這被認爲是Python的IDLE編輯器的一個問題。 (我在OSX上運行Python 3.3.0,但2.7.3出現同樣的問題)Python,IDLE:遞歸錯誤太多

我正在使用IDLE編寫Python程序。我的問題是:調用一個遞歸函數,它自己調用次數太多(1000次),並不會給我一個運行時錯誤,而是一直給我發送錯誤消息,直到關閉程序。

應該發送的錯誤是:「RuntimeError:超過最大遞歸深度。」 它發送錯誤千倍isntead只是一個點出來到腳本的問題是:

Traceback (most recent call last): 
    File "<pyshell#112>", line 1, in <module> 
    factorial(1.5) 
    File "/Users/User/Documents/Python/Scripts/program1.py", line 187, in factorial 
    recurse = factorial(n-1) 
    File "/Users/User/Documents/Python/Scripts/program1.py", line 187, in factorial 
    recurse = factorial(n-1) 

這正好與所有的遞歸函數調用自身的次數太多,但這裏使用的具體功能是:

def factorial(n): 
    if n == 0: 
     return 1 
    else: 
     recurse = factorial(n-1) 
     result = n * recurse 
     return result 
+0

相關:http://stackoverflow.com/questions/2401447/python-recursive-function-error-maximum-recursion-depth-exceeded – 2013-03-15 18:08:35

+0

相關:HTTP:// stackoverflow.com/questions/8177073/python-maximum-recursion-depth-exceeded – 2013-03-15 18:08:56

+0

它看起來像IDLE打印出每一個堆棧幀(其中有很多)。我不知道是否有限制它打印多少幀的方法。 – NPE 2013-03-15 18:09:51

回答

1

要展示那些數以百計的錯誤停止蟒蛇,你可以使用一個try-except塊:

def factorial(n): 
    if n == 0: 
     return 1 
    else: 
     recurse = factorial(n-1) 
     result = n * recurse 
     return result 
try: 
    print (factorial(6000)) 
except RuntimeError as e: 
    print (e) 

輸出:

#print factorial(1000) 
93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000 

#print factorial(6000) 
maximum recursion depth exceeded in comparison 

你的情況發生這個錯誤是因爲python在最大遞歸深度上有一個限制,是否有阻止C堆棧溢出。但是你可以使用sys.setrecursionlimit更改:

In [4]: import sys 

In [5]: sys.getrecursionlimit() 
Out[5]: 1000 
+0

謝謝,但這給了我一個未知原因的語法錯誤。 – kongehund 2013-03-15 18:25:11

+0

@ user2175018 python版本?在py3.x中使用'print()'作爲函數。 – 2013-03-15 18:26:07

+0

謝謝,監督失蹤()。 Python 3.3.0 – kongehund 2013-03-15 18:31:12

0

問題是,你要使用浮子和代碼不處理。所以,1.5 -1變成0.5,這導致第一次遞歸調用。然後,0.5 -1變成-0.5,這導致進一步的遞歸調用。

只是爲了搞定,使用方法: -

if n<=0: return 1

+0

感謝您的回答,但我希望修復它,而不是避免它。 – kongehund 2013-03-15 18:52:55

+0

我沒有明白! – GodMan 2013-03-15 18:56:31

+0

噢,我的問題不是我不知道是什麼原因導致錯誤,而是程序向我發送了1000條錯誤消息而不是1.事實上,將代碼添加到函數中可以修復函數,當嘗試使IDLE向我發送1錯誤消息而不是1000時,它超出了遞歸調用的最大數量。 – kongehund 2013-03-15 19:03:06