这个关于加泰罗尼亚数字的Python代码有什么问题?

时间:2015-03-20 17:40:39

标签: python numpy catalan

我是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]])

在最后一个问题解决之后,我会尝试在答案中建议一些其他版本(比如先填充一个零数组)。

5 个答案:

答案 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