我是Python的新手。这是一个家庭作业问题,但它很难,因为我只有一点Java经验。该代码应该使用其递归定义打印第一个加泰罗尼亚语数字:
C(n + 1) = C(n) * (4n + 2) / (n + 2)
编辑:
我当前的代码看起来像这样,唯一剩下的问题是使用savetxt()方法将此代码得到的所有C(n)数字放在txt中。
import numpy
c = []
c.append(1)
for i in xrange(0,1000000000):
c.append((4*i+2)*c[i]/(i+2))
print (c[i])
if c[i]>= 1000000000:
break
numpy.savetxt("catalan",numpy.c_[i, c[i]])
在最后一个问题解决之后,我会尝试在答案中建议一些其他版本(比如先填充一个零数组)。
答案 0 :(得分:1)
指数超出范围。您的第一个i
等于1,但c
只有一个元素,即索引0.所以只需将范围更改为(0,1000000000)。
顺便说一下,不要使用范围,使用xrange,它会更快,占用更少的内存。当您使用range
时,Python会创建一个该大小的数组。大小为1000000000的数组需要大量内存。相反,xrange
创建一个迭代器,因此它需要更少的内存。
答案 1 :(得分:1)
你可以通过实际使用数组来更好地利用numpy
(这也使得代码看起来更像我认为你最初拥有它):
import numpy as np
def catalan(x):
"""Create an array of the first x 'Catalan numbers'."""
c = np.zeros(x)
c[0] = 1
for n in xrange(x-1):
c[n+1] = c[n] * ((4 * n) + 2) / (n + 2)
return c
如果你能提出一个非递归定义,你可以大大提高速度(参见例如Is a "for" loop necessary if elements of the a numpy vector are dependant upon the previous element?)。请注意,这些数字变得很快(但是你只能在64位整数中使用前34个)!
答案 2 :(得分:1)
这几乎是Python:: "IndexError: list index out of range"的完全重复;在那里我提出,不应该使用重复,而应该使用迭代公式来产生加泰罗尼亚数字;在您的情况下,您正在使用迭代方法,但将它们存储到数组中。与创建存储所有n
加泰罗尼亚语数字的数组相比,我的方法非常节省内存:
def catalans():
C = 1
n = 0
while True:
yield C
C = 2 * (2 * n + 1) * C // (n + 2)
n += 1
with open('catalan', 'w') as output:
for n, C in enumerate(1, catalans()):
print(n, C, file=output)
if C >= 1000000000:
break
答案 3 :(得分:0)
for i in range(0, 1000000000):
这应该有用。
在第一次迭代中,您尝试使用c [1],但它并不存在。 您只有c [0]的值,因此列表索引超出范围。
答案 4 :(得分:0)
如果你使用的话会不容易吗?
250px