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, Рекурсия, Стек и куча