Python:: "IndexError: список индексов вне диапазона"

Я экспериментирую с несколькими элементами программирования на Python и пытаюсь создать массив каталонских номеров.

Я продолжаю получать вышеупомянутую ошибку, но я не могу понять, почему или найти какие-либо информативные источники информации.

Функция вычисляет следующий элемент списка C, используя текущий элемент, начиная с C[0]=0.

Я сократил свой код, чтобы сделать вещи проще, но при этом сохранить ошибку.

from math import *

C = []
C += [0]
def ppC(n,C):  # increment list C
    print( C[n] ) # list index out of range
    C += [ C[n]*(4*n+2)/(n+2) ]
    n += 1
    ppC(n+1,C) # recursive

ppC(0,C)        # RUN

3 ответа

Решение
n += 1
ppC(n+1,C) # recursive

С этими двумя линиями ваш второй вызов ppC будет иметь n значение два, то есть один за концом массива. Попробуйте только увеличивать n один раз.

from math import *

C = []
C += [0]
def ppC(n,C):  # increment list C
    print( C[n] ) # list index out of range
    C += [ C[n]*(4*n+2)/(n+2) ]
    ppC(n+1,C) # recursive

ppC(0,C)        # RUN

Вероятно, у вас также должна быть какая-то проверка, чтобы определить, когда вы должны прекратить генерировать числа, иначе функция будет работать вечно. (или, скорее, он будет работать тысячу раз и завершится с ошибкой "превышена максимальная глубина рекурсии".) Например:

from math import *

C = []
C += [1]
def ppC(n,C):  # increment list C
    print( C[n] ) # list index out of range
    C += [ C[n]*(4*n+2)/(n+2) ]
    if len(C) > 100: 
        return
    ppC(n+1,C) # recursive

ppC(0,C)        # RUN

Еще кое-что. Разве первый каталонец не номер один, а не ноль?

from math import *

C = []
C += [1]
def ppC(n,C):  # increment list C
    print( C[n] ) # list index out of range
    C += [ C[n]*(4*n+2)/(n+2) ]
    if len(C) > 10: 
        return
    ppC(n+1,C) # recursive

ppC(0,C)        # RUN

Результат:

1
1
2
5
14
42
132
429
1430
4862

Каталонские числа могут быть получены полностью итеративно, таким образом, вы можете превратить свою функцию в генератор:

def catalans():
    C = 1
    n = 0
    while True:
        yield C
        C = 2 * (2 * n + 1) * C // (n + 2)
        n += 1

# then to get 100 first numbers in a list, you can do
from itertools import islice
print(list(islice(catalans(), 100)))

# or print forever:
for i in catalans():
    print(i)

Ладно, похоже, что то, что Кевин сказал, правда: оно запускает рекурсию и увеличивает ее во второй раз, прежде чем массив будет расширен, чтобы учесть это. Также каталонский номер C[0]=1,

Вот мой полный (и теперь полностью функциональный) код:

from math import *

C = []
C += [1]
def ppC(n,C):
    print( C[n] )
    C += [ C[n]*(4.*n+2)/(n+2) ]
    if prompt(n) == 1:
        ppC(n+1,C)

def prompt(n):
    if n%10 == 0:   
        print("continue?")
        m = raw_input("(y/n)")
        if m != "y":
            return 0
        else:
            return 1
    else:
        return 1

ppC(0,C)        # RUN 
Другие вопросы по тегам