14

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

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”结果。为什么会这样?我该如何解决?

4

2 回答 2

11

我假设您使用的是 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.

于 2015-07-16T16:38:59.127 回答
2

除了xnx 的答案,请注意,在标准库Python 3.8中添加math.comb(二项式系数) 后,我们还可以这样计算加泰罗尼亚数:

import math

def catalan(n):
  return math.comb(2*n, n) / (n+1)

catalan(511) # 2.1902514917394773e+303
于 2019-06-01T11:21:15.847 回答