2

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

解决最后一个问题后,我将尝试答案中建议的其他版本(例如先填充零数组)。

4

5 回答 5

2

这几乎是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
于 2015-03-20T18:01:10.320 回答
1

索引超出范围。您的第一个i等于 1,但c只有一个元素,即索引 0。所以只需将范围更改为 (0,1000000000)。

顺便说一句,不要使用范围,使用xrange,它会更快并且占用更少的内存。当您使用 时range,Python 会创建一个该大小的数组。大小为 1000000000 的数组需要大量内存。相反,xrange创建一个迭代器,这样它占用更少的内存。

于 2015-03-20T17:44:48.007 回答
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

如果您可以提出非递归定义,则可以显着加快速度(请参阅如果 numpy 向量的元素依赖于前一个元素,是否需要“for”循环?)。请注意,这些数字会很快变大(您只能将前 34 个放入 64 位整数中)!

于 2015-03-20T17:49:23.680 回答
0
for i in range(0, 1000000000):

这应该有效。

在您的第一次迭代中,您尝试使用 c[1],但它不存在。您只有 c[0] 的值,因此列表索引超出范围。

于 2015-03-20T17:47:18.743 回答
0

如果你使用 while 会不会很容易?

C1,C2 = 1.0, 1.0
n=0
while C1<=1000000000:
    print(C1)
    C1,C2 = (((4*n+2)/(n+2)) * (C1)), C1
    n+=1
于 2016-07-10T04:13:35.243 回答