2

私はPythonが初めてです。これは宿題ですが、Java の経験が少ないので大変です。コードは、再帰的な定義を使用して最初のカタロニア語番号を出力することになっています。

C(n + 1) = C(n) * (4n + 2) / (n + 2)

編集:

私の現在のコードは次のようになります。残っている唯一の問題は、このコードで取得したすべての C(n) 番号を savetxt() メソッドを使用して 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 の要素が 1 つしかありません。そのため、範囲を (0,1000000000) に変更するだけです。

ちなみに、range を使用せずに 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" ループは必要ですか? を参照してください)。ただし、これらの数値はすぐに大きくなることに注意してください (64 ビット整数に収まるのは最初の 34 だけです)。

于 2015-03-20T17:49:23.680 に答える
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 に答える
0
for i in range(0, 1000000000):

これはうまくいくはずです。

最初の反復で、c[1] を使用しようとしていますが、存在しません。c[0] の値しかないため、リスト インデックスは範囲外です。

于 2015-03-20T17:47:18.743 に答える