2016-12-04 137 views
1

這遞歸階乘計算器運行正常一路高達994的輸入,當我收到此錯誤:「RecursionError:最大遞歸深度比較超標」。有人能解釋這是什麼意思嗎?怎樣纔能有最大量的遞歸?提前致謝。遞歸階乘計算器RecursionError

def factorial(x): 
    if(x == 0): 
     return 1 
    else: 
     return x * factorial(x - 1) 
while True: 
    u_input = input("") 
    print(factorial(int(u_input))) 

def calc_factorial(num): 
    num-=1 
    fact_total = 1 
    while num > 0: 
     fact_total *= num 
     num-=1 
    return(fact_total) 

編輯: 我明白,遞歸重新使用來自函數作爲一個循環中的一個函數,但我不明白是什麼遞歸深度,並希望該解釋。我無法從其他問題的答案中看出來。抱歉的混淆。

+1

的可能的複製[最大遞歸深度?](http://stackoverflow.com/questions/3323001/maximum-recursion-depth) –

+0

我見過但─我想知道什麼是遞歸深度是? – Matt

回答

2

的錯誤意味着什麼,它說:Python的限制的多少可以遞歸調用進行深度。缺省值是1000,它被選爲一個數字,這意味着您最有可能在某處有無限遞歸。由於沒有計算機可以跟蹤無限次數的遞歸調用(並且這樣的程序永遠不會完成),因此停止使用此錯誤消息被認爲比計算機可以處理的更爲重要,這最終導致堆棧溢出。

,如果你想與sys.setrecursionlimit您可以更改此限制,但要避免這個問題的最好辦法是改變你的程序反覆工作,而不是遞歸。幸運的是,這很容易讓一個階乘計算:

def factorial(x): 
    result = 1 
    for num in range(1, x+1): 
     result *= num 
    return result 
+0

爲什麼它給它一個最大值? – Matt

+0

我有一個迭代算法,但目前我正在嘗試尋找更快的方法,因爲對於大量的迭代方法需要一段時間。 – Matt

+0

@Matt,除非你做錯了,迭代版本應該更快。函數調用在時間和內存中都很昂貴,因此是極限。 –

3

遞歸調用就像任何其他函數調用和函數調用使用內存來跟蹤狀態的每個函數內。你會注意到你得到一個很長的回溯,顯示堆棧上的所有嵌套函數調用。由於內存是有限的,即使沒有python的強制限制,遞歸深度(嵌套函數調用的數量)也是固有的限制。

0

有建於與數學庫功能,它改進算法,迅速得到的階乘的價值,所以,當我們正在寫的遞歸算法來獲得階乘值,會有一個遞歸限制。所以,如果我們使用內置的庫,那麼我們可以逃避這個問題。

import math 
math.factorial(5) 

Answer : 120