RecursionError: maximum recursion depth exceeded — почему рекурсия падает?
Написал рекурсивную функцию для факториала, запускаю — и получаю RecursionError: maximum recursion depth exceeded. Почему рекурсия упирается в лимит и как её правильно остановить?
2 ответа
RecursionError значит: функция вызывает сама себя слишком много раз и упирается в предел Python (по умолчанию около 1000 вложенных вызовов). Почти всегда причина — нет условия выхода (базового случая) или оно недостижимо, поэтому рекурсия бесконечная.
Ошибка — нет остановки:
def factorial(n):
return n * factorial(n - 1) # никогда не остановится
Исправление — добавить базовый случай:
def factorial(n):
if n <= 1: # условие выхода
return 1
return n * factorial(n - 1)
Частые причины:
- Забыли
if-условие выхода. - Аргумент не приближается к базовому случаю (например, забыли
n - 1, и вызываетсяfactorial(n)). - Случайно вызвали функцию с аргументом, который не дойдёт до базы (отрицательное число при
if n == 0).
Для очень глубокой рекурсии иногда поднимают лимит (sys.setrecursionlimit), но обычно правильнее переписать в цикл или проверить условие выхода. Сначала всегда убеждайтесь, что у каждой рекурсии есть достижимый базовый случай.
Ещё одна нередкая причина — случайная бесконечная рекурсия в свойствах/методах класса, например в __init__ вызвали метод, который снова создаёт объект. Но у новичков №1 — именно отсутствие условия if, которое останавливает спуск. Проверьте: есть ли ветка, где функция возвращает значение без обращения к самой себе.