我是python的新手(以及一般的编程),我班上被要求计算高达10亿的加泰罗尼亚语数字,但我为它编写的程序没有按预期工作。
from numpy import division
C=1
n=0
while C<=10000000000:
print (C)
C=(4*n+2)/(n+2)*C
n=n+1
这是打印的内容
1, 1, 2, 4, 8, 24, 72, 216, 648, 1944年, 5832, 17496, 52488, 157464, 472392, 1417176, 4251528, 12754584, 38263752, 114791256, 344373768, 1033121304, 3099363912, 9298091736,
正如你从我的第四次迭代中看到的那样,我得到了错误的数字,我不明白为什么。
编辑: 我使用的数学定义没有错!我知道Wiki有另一个定义,但这个没有错。 Co = 1,Cn + 1 =(4 * n + 2)/(n + 2)* Cn
答案 0 :(得分:3)
C=(4*n+2)/(n+2)*C
这会以错误的顺序应用计算。因为您使用整数运算,如果您尚未考虑(4*n+2)/(n+2)
,C
会丢失信息。正确的计算是:
C=C*(4*n+2)/(n+2)
答案 1 :(得分:0)
试试这个:
from scipy.special import factorial
C = 1
n = 0
while C <= 10000000000:
print(C)
C = factorial(2*n, exact=True)/(factorial((n+1), exact=True)*factorial(n, exact=True))
n = n + 1
它对我有用:)
答案 2 :(得分:0)
在翻译成代码时,您对加泰罗尼亚语数字的数学定义不正确。
这是因为Python等编程语言中的运算符优先级。
乘法和除法都具有相同的优先级,因此它们从左到右计算。发生的事情是除法运算(4*n+2)/(n+2)
在与C
相乘之前发生。当n
为2时,2*(2*n+2)/(n+2)
变为10/4
,整数算术为2
。在此阶段1*C
为2
,会4
而不是给出预期的5
。
一旦系列中的数字不正确,迭代计算就不正确。
这里的定义为Catalan Numbers
这意味着,第n个加泰罗尼亚语号由下式给出:
import operator as op
def ncr(n, r):
r = min(r, n-r)
if r == 0: return 1
numer = reduce(op.mul, xrange(n, n-r, -1))
denom = reduce(op.mul, xrange(1, r+1))
return numer//denom
def catalan(n):
return ncr(2*n, n)/(n+1)
这不是很有效,但它至少是正确的。
要计算系列,您可以使用递归公式。
N=1000000 # limit
C=1
for i in xrange(0, N+1):
print i,C
C = (2*(2*i +1)*C)/(i+2)
对于前几个,它看起来像这样:
0 1
1 1
2 2
3 5
4 14
5 42
6 132
7 429
8 1430
9 4862
10 16796
答案 3 :(得分:0)
这是使用递归解决的:
def catalan(n):
if n <=1 :
return 1
res = 0
for i in range(n):
res += catalan(i) * catalan(n-i-1)
return res
for i in range(10000000000):
print (catalan(i))
的更多信息
答案 4 :(得分:0)
基于Catalan Numbers的表达式:
from math import factorial
C = 1
n = 0
while C <= 10000000000:
print(C)
C = (factorial(2 * n)) / (factorial(n + 1) * factorial(n))
n = n + 1
<强>返回:强>
1
1.0
1.0
2.0
5.0
14.0
42.0
132.0
429.0
1430.0
4862.0
16796.0
58786.0
208012.0
742900.0
2674440.0
9694845.0
35357670.0
129644790.0
477638700.0
1767263190.0
6564120420.0