繁体   English   中英

如何防止在 Python 中实现阶乘的递归错误

[英]How to prevent a recursion error implementing factorial in Python

我正在开发一个数学套件,目前在实现阶乘 function 的递归版本时遇到问题。 问题是当我在我的贝叶斯组合 function 中使用它时:

C(n,k) = n! / k! * (n-k)! 

我已经独立测试过它并且它应该可以正常工作,但是一旦我将它放入我的组合 function 中,我就会收到错误Recursion Error: maximum recursion depth exceeded in comparison ,即使对于非常小的 n 和 k 值。

我已经实现了一个完美运行的迭代解决方案,那么为什么我不断收到递归错误?

这是递归实现:

def factorial(n):
    if n == 1 or n == 0:
        return n
    else:
        return n * factorial(n - 1)

这是迭代实现:

def factorial(n):
    result = 1
    for i in range(1, n+1):
        result *= i
    return result

它们在 function 组合中使用,如下所示:

def combination(n, k):
    result = factorial(n) / (factorial(k) * factorial(n - k))
    return result

递归 function 似乎仅在 k = 1 时才有效。

以下是一些产生递归错误的示例输出:

combination(2,1) = 2

combination(2,2) = 

Traceback (most recent call last):
  File "baysian.py", line 44, in <module>
    answer = combination(n, k)
  File "baysian.py", line 18, in combination
    result = factorial(n) / (factorial(k) * factorial(n - k))
  File "baysian.py", line 9, in factorial
    return n * factorial(n - 1)
  File "baysian.py", line 9, in factorial
    return n * factorial(n - 1)
  File "baysian.py", line 9, in factorial
    return n * factorial(n - 1)
  [Previous line repeated 994 more times]
  File "baysian.py", line 6, in factorial
    if n == 1:
RecursionError: maximum recursion depth exceeded in comparison

这个页面:

import sys
print(sys.getrecursionlimit())

然后调整:

sys.setrecursionlimit(<number>)

如果你输入的数字太高,你的机器会崩溃

事实证明,我的递归阶乘实现是不正确的。 它将返回 0 for.0 而不是 1。我添加了一些更改,现在它可以工作了。 这是我修改后的解决方案。

def factorial(n):
    if n == 1:
        return n
    elif n == 0:
        return 1
    else:
        return n * factorial(n - 1)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM