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)Решения
- Проверьте базовый случай: достигается ли он каждый раз?
- Работайте с циклом и собственным стеком вместо рекурсии (итеративно).
- Хвостовая рекурсия Python не оптимизируется; перестройте вручную.
- Для допустимой глубокой рекурсии задайте
sys.setrecursionlimit(10000)(осторожно, риск сбоя) или перейдите на итерацию. - Мемоизация (
functools.lru_cache) избегает повторных вызовов, но не решает проблему глубины. - Выведите аргументы через
printи проверьте, как они меняются.
См. также: StackOverflowError, Рекурсия, Стек и куча