Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用递归的Python阶乘_Python_Recursion - Fatal编程技术网

使用递归的Python阶乘

使用递归的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)) 计算如此大的数的阶乘会导致堆栈

我试图在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))

计算如此大的数的阶乘会导致堆栈内存溢出,因为每当我们应用递归时,所有递归调用都会将自己的内存堆叠在另一个上面

因此,对于如此大的数量,递归堆栈越来越大,递归调用导致堆栈溢出


这就是为什么内核死亡时不会产生任何结果

阶乘的标准基本情况是0,而不是1。您的代码在0!中失败!。此外,您还有分组问题,因此实际上,最终的
%
什么也不做。如果希望它按您的意愿运行,则需要在
(n%mod)
周围添加括号。同样,对阶乘使用递归也没有意义。这是一个简单的迭代。您根本不需要增加堆栈限制。阶乘不是递归的好选择。你能解释一下
mod
?为什么不
fac(n-1)*n
?是否需要
mod
来演示堆栈溢出?不使用mod将生成非常大的n值较高的数字,从而导致非常缓慢的实现。在没有mod的情况下尝试上面的代码,例如n=10000左右。