【问题标题】:Python calculating Catalan NumbersPython计算加泰罗尼亚数字
【发布时间】:2015-07-16 16:29:27
【问题描述】:

我有使用二项式系数方法计算加泰罗尼亚数字的代码。

def BinominalCoefficient(n,k):
    res = 1;
    if (k > n - k):
        k = n - k
    for i in range(k):
        res *= (n - i)
        res /= (i + 1)
    return res
def CatalanNumbers(n):
   c = BinominalCoefficient(2*n, n)
   return (c//(n+1))
print (CatalanNumbers(510))

当我尝试计算 n 大于 510 的加泰罗尼亚数时,我得到一个“nan”结果。为什么会这样?我该如何解决?

【问题讨论】:

  • 你得到nan,因为BinominalCoefficient(1022, 511)返回inf
  • 您使用的是 Python 3 吗?如果是这样,请使用整数除法 // 来避免浮点数(无论如何,您不需要它们进行此计算)。
  • 你用的是什么python版本?我在 python 2.6.6 和 python 3.4.3 中都得到了正确的结果
  • 我使用的是 Python 3.4.3

标签: python algorithm catalan


【解决方案1】:

我假设您使用的是 Python 3。

您的res /= (i + 1) 应该是res //= (i + 1) 以强制进行整数运算:

def BinominalCoefficient(n,k):
    res = 1
    if (k > n - k):
        k = n - k
    for i in range(k):
        res *= (n - i)
        res //= (i + 1)
    return res
def CatalanNumbers(n):
   c = BinominalCoefficient(2*n, n)
   return (c//(n+1))
print (CatalanNumbers(511))

返回

2190251491739477424254235019785597839694676372955883183976582551028726151813997871354391075304454574949251922785248583970189394756782256529178824038918189668852236486561863197470752363343641524451529091938039960955474280081989297135147411990495428867310575974835605457151854594468879961981363032236839645

您会得到nan,因为 Python 3 中的除法 /= 返回一个浮点数,该浮点数溢出到 inf

【讨论】:

    【解决方案2】:

    除了xnx's answer,注意从Python 3.8开始,加上标准库中的math.comb(二项式系数),我们也可以这样计算加泰罗尼亚数:

    import math
    
    def catalan(n):
      return math.comb(2*n, n) / (n+1)
    
    catalan(511) # 2.1902514917394773e+303
    

    【讨论】:

    • 请注意,此解决方案受浮动边界的限制。可以通过这种方式计算的最大加泰罗尼亚语数是 catalan(519),对于 catalan(520) 你会得到 OverflowError
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-05
    • 1970-01-01
    相关资源
    最近更新 更多