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 Solutions collect form web for “Python :: "IndexError: индекс индекса вне диапазона"”

 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 
  • Как получить размер списка
  • Что происходит в бесконечных вложенных списках?
  • TypeError: только целые массивы с одним элементом могут быть преобразованы в индекс 3
  • Странное поведение Python со списком и добавлением
  • Распаковка 1-кортежа в списке длины 1
  • Лучший и / или быстрый способ создания списков в python
  • Удалить элемент списка Python
  • Ссылка на часть списка - Python
  • Создание дубликатов в списке
  • Добавить несколько переменных в список в Python
  • Python: выберите подмножество из списка на основе набора индексов
  • Python - лучший язык программирования в мире.