Что не так с этим кодом Python о каталонских числах?
Я новичок в Python. Это домашнее задание, но оно сложное, так как у меня мало опыта в Java. Код должен печатать первые каталонские числа, используя его рекурсивное определение:
C(n + 1) = C(n) * (4n + 2) / (n + 2)
РЕДАКТИРОВАТЬ:
Мой текущий код выглядит следующим образом, и единственная оставшаяся проблема состоит в том, чтобы поместить все числа C(n), которые я получаю по этому коду, в txt, используя метод savetxt().
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 ответов
Индекс вне диапазона. Ты первый i
равно 1, но c
имеет только один элемент с индексом 0. Так что просто измените диапазон на (0,1000000000).
Кстати, не используйте range, используйте xrange, это будет быстрее и займет меньше памяти. Когда вы используете range
, Python создает массив такого размера. Массив размером 1000000000 занимает тонну памяти. Вместо, xrange
создайте итератор, чтобы он занимал гораздо меньше памяти.
Это почти точная копия Python:: "IndexError: список индексов вне диапазона"; там я предложил вместо использования повторения просто использовать итерационную формулу для получения каталонских чисел; в вашем случае вы используете итеративный подход, но сохраняете их в массив. Мой подход достаточно эффективен по памяти по сравнению с созданием массива для хранения всех 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
Вы можете получить лучшее использование из 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 зависят от предыдущего элемента?). Обратите внимание, что эти цифры быстро увеличиваются (вы можете поместить только первые 34 в 64-разрядное целое число)!
for i in range(0, 1000000000):
Это должно работать.
На первой итерации вы пытаетесь использовать c[1], но его не существует. У вас есть только значение для c[0], поэтому индекс списка находится вне диапазона.
Не будет легко, если вы используете какое-то время?
C1,C2 = 1.0, 1.0
n=0
while C1<=1000000000:
print(C1)
C1,C2 = (((4*n+2)/(n+2)) * (C1)), C1
n+=1