【问题标题】:Recursion binomial coefficient递归二项式系数
【发布时间】:2014-10-15 17:12:27
【问题描述】:

我必须定义一个接受两个数字的函数:n 和 k (n >= k),并返回这两个数字的二项式系数。

#defining a function that computes the factorial of an integer

def fac(b):
    if b==1:
        return 1
    else:
        return b * fac(b-1)

#takes two integers and does the binomial coefficient operand

def combinations(n,k):
    result = (fac(n)) / (fac(k) * fac(n-k))
    return result

n=10
k=2

print(combinations(n,k))    

这适用于小数字,但当我采用较大的数字(例如 1000 等)时,它就不起作用了。 它返回: fac 中的第 5 行 return b * fac(b-1) 几次。 后跟:RuntimeError:比较超出最大递归深度。

有人能解释一下为什么这些函数不适用于大数字,或许可以提供一些关于我可以做些什么来解决这个问题的提示吗? python如何处理递归和大数?

【问题讨论】:

  • 更好的解决方案是使用伽玛函数自然对数中的双精度数,避免递归和整数。
  • 请不要同时问两个完全不相关的问题。
  • “它不起作用”是什么意思?太慢了?超出递归深度?还有什么?
  • 我是编程新手,函数必须是递归的。
  • @uselpa 它返回:第 5 行在 fac 返回 b * fac(b-1) 几次。后跟:RuntimeError:比较中超出最大递归深度

标签: python python-3.x recursion combinations


【解决方案1】:

默认情况下,Python 将递归深度限制为 1000。您可以通过在代码开头添加以下内容来更改它(在此示例中将限制设置为 2000):

import sys
sys.setrecursionlimit(2000)

要询问用户输入,请尝试:

n=int(input("Enter n:"))
k=int(input("Enter k:"))

这是完整的代码(只需复制/粘贴即可):

import sys
sys.setrecursionlimit(2000)

def fac(b):
    if b==1:
        return 1
    else:
        return b * fac(b-1)

def combinations(n,k):
    result = (fac(n)) / (fac(k) * fac(n-k))
    return result

n=int(input("Enter n:"))
k=int(input("Enter k:"))

print(n, k, combinations(n,k))

【讨论】:

  • 我用 n=999 和 k=10 尝试了我的函数。仍然超出递归深度。
  • 对我来说很好。你设置了什么限制?
  • 您的意思是您没有将递归限制设置为 2000,就像我在回答中显示的那样?如果是这样,为什么不呢?
  • 我在我的答案中发布了整个代码。尝试复制/粘贴它(完全!)。 999 和 10 对我来说效果很好。
  • 好的,首先:它确实适用于 eval 和 int,所以谢谢你。第二:你说python将递归深度限制为1000,这意味着它可以取小于1000的数字,对吗?我试过999,没有用。当我使用: import sys sys.setrecursionlimit(2000) 一切都很好,但是有没有另一种方法可以在不导入的情况下完成这项工作?谢谢。 @uselpa
猜你喜欢
  • 1970-01-01
  • 2021-10-10
  • 1970-01-01
  • 2011-05-03
  • 1970-01-01
  • 2018-10-06
  • 1970-01-01
  • 2014-12-01
  • 1970-01-01
相关资源
最近更新 更多