为了计算加泰罗尼亚数字,我写了两个代码。One (def " Catalan ")递归工作并返回正确的加泰罗尼亚数字。
dicatalan = {}
def catalan(n):
if n == 0:
return 1
else:
res = 0
if n not in dicatalan:
for i in range(n):
res += catalan(i) * catalan(n - i - 1)
dicatalan[n] = res
return dicatalan[n]另一个(def "catalanFormula")应用了隐式公式,但不能从n=30开始精确计算。问题源于浮点数-对于k=9,程序返回"6835972“而不是"6835971.999999999”,并且从这一刻开始累积错误,直到最终的错误答案。
(打印行用于检查)
def catalanFormula(n):
result = 1
for k in range(2, n + 1):
result *= ((n + k) / k)
print (result)
return int(result)我尝试了四舍五入,但失败了,尝试了Decimal导入,但仍然没有得到正确的结果。
我需要"catalanFormula“像”加泰罗尼亚语“一样完美地工作;你有什么想法吗?
谢谢!
发布于 2012-12-09 19:36:03
请参阅bigfloat包。
from bigfloat import *
setcontext(quadruple_precision)
def catalanFormula(n):
result = BigFloat(1)
for k in range(2, n + 1):
result *= ((BigFloat(n) + BigFloat(k)) / BigFloat(k))
return result
catalanFormula(30)输出:
BigFloat.exact('3814986502092304.00000000000000000043', precision=113)发布于 2012-12-09 19:38:49
尝试分别计算分子和分母,并在末尾将它们相除。如果你这样做了,你应该能够用浮点数走得更远一点。
我确信Python有一个用于有理数的包。使用有理数是一个更好的想法。
https://stackoverflow.com/questions/13786927
复制相似问题