2016-12-04 175 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