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