← Все вопросы

RecursionError: maximum recursion depth exceeded — почему рекурсия падает?

Задан 37 месяцев назад896 просмотров2 ответа
7

Написал рекурсивную функцию для факториала, запускаю — и получаю RecursionError: maximum recursion depth exceeded. Почему рекурсия упирается в лимит и как её правильно остановить?

2 ответа

11
✓ Принятый ответ — помог автору

RecursionError значит: функция вызывает сама себя слишком много раз и упирается в предел Python (по умолчанию около 1000 вложенных вызовов). Почти всегда причина — нет условия выхода (базового случая) или оно недостижимо, поэтому рекурсия бесконечная.

Ошибка — нет остановки:

def factorial(n):
    return n * factorial(n - 1)   # никогда не остановится

Исправление — добавить базовый случай:

def factorial(n):
    if n <= 1:        # условие выхода
        return 1
    return n * factorial(n - 1)

Частые причины:

  1. Забыли if-условие выхода.
  2. Аргумент не приближается к базовому случаю (например, забыли n - 1, и вызывается factorial(n)).
  3. Случайно вызвали функцию с аргументом, который не дойдёт до базы (отрицательное число при if n == 0).

Для очень глубокой рекурсии иногда поднимают лимит (sys.setrecursionlimit), но обычно правильнее переписать в цикл или проверить условие выхода. Сначала всегда убеждайтесь, что у каждой рекурсии есть достижимый базовый случай.

4

Ещё одна нередкая причина — случайная бесконечная рекурсия в свойствах/методах класса, например в __init__ вызвали метод, который снова создаёт объект. Но у новичков №1 — именно отсутствие условия if, которое останавливает спуск. Проверьте: есть ли ветка, где функция возвращает значение без обращения к самой себе.

Ваш ответ

, чтобы ответить на вопрос.