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