使用递归的Python阶乘
我试图在Python3.6中使用递归找到一个大数的阶乘。虽然我已经将递归限制设置为10**9,但仍然运行代码会导致内核死机。我知道迭代解更好,但我想知道原因使用递归的Python阶乘,python,recursion,Python,Recursion,我试图在Python3.6中使用递归找到一个大数的阶乘。虽然我已经将递归限制设置为10**9,但仍然运行代码会导致内核死机。我知道迭代解更好,但我想知道原因 import sys mod = 10**9+7 sys.setrecursionlimit(10**9) def fac(n): if(n == 1): return 1 return (fac(n-1)%mod*n%mod)%mod print(fac(10000)) 计算如此大的数的阶乘会导致堆栈
import sys
mod = 10**9+7
sys.setrecursionlimit(10**9)
def fac(n):
if(n == 1):
return 1
return (fac(n-1)%mod*n%mod)%mod
print(fac(10000))
计算如此大的数的阶乘会导致堆栈内存溢出,因为每当我们应用递归时,所有递归调用都会将自己的内存堆叠在另一个上面 因此,对于如此大的数量,递归堆栈越来越大,递归调用导致堆栈溢出
这就是为什么内核死亡时不会产生任何结果阶乘的标准基本情况是0,而不是1。您的代码在0!中失败!。此外,您还有分组问题,因此实际上,最终的
%
什么也不做。如果希望它按您的意愿运行,则需要在(n%mod)
周围添加括号。同样,对阶乘使用递归也没有意义。这是一个简单的迭代。您根本不需要增加堆栈限制。阶乘不是递归的好选择。你能解释一下mod
?为什么不fac(n-1)*n
?是否需要mod
来演示堆栈溢出?不使用mod将生成非常大的n值较高的数字,从而导致非常缓慢的实现。在没有mod的情况下尝试上面的代码,例如n=10000左右。