EMZETT.
Увійти

RecursionError (Python)

Коротко: Функція надто часто викликає сама себе без зупинки; Python перериває приблизно на 1000 рівнях.

Докладніше: Повідомлення: RecursionError: maximum recursion depth exceeded. Кожен виклик функції займає місце в стеку викликів. Python обмежує глибину (за замовчуванням приблизно 1000), щоб запобігти збою. Це аналог StackOverflowError у Java.

Подробиці

Можливі причини

  • Відсутній або неправильний базовий випадок: у рекурсії немає кінця.
  • Крок не веде до базового випадку (наприклад, n не зменшується).
  • Взаємна рекурсія між двома функціями.
  • Дуже глибока, але допустима рекурсія (довгі списки, дерева, глибокі графи).
  • Метод ненавмисно викликає сам себе через __getattr__/property.

Приклад

def factorial(n):
    return n * factorial(n - 1)   # немає базового випадку!
 
def factorial(n):
    if n <= 1:                    # базовий випадок
        return 1
    return n * factorial(n - 1)

Рішення

  1. Перевірте базовий випадок: чи досягається він щоразу?
  2. Працюйте з циклом і власним стеком замість рекурсії (ітеративно).
  3. Хвостова рекурсія Python не оптимізується; перебудуйте вручну.
  4. Для допустимої глибокої рекурсії задайте sys.setrecursionlimit(10000) (обережно, ризик збою) або перейдіть на ітерацію.
  5. Мемоїзація (functools.lru_cache) уникає повторних викликів, але не розв’язує проблему глибини.
  6. Виведіть аргументи через print і перевірте, як вони змінюються.

Див. також: StackOverflowError, Рекурсія, Стек і купа