微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

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

我已经独立对其进行了测试,它可以正常工作,但是一旦我将它放入我的组合函数中,我就会收到错误 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

它们在组合函数中使用如下:

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

递归函数似乎只有在 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",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

解决方法

来自 this 页:

import sys
print(sys.getrecursionlimit())

然后调整:

sys.setrecursionlimit(<number>)

如果输入的数字太大会导致机器崩溃

,

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。