По умолчанию Python устанавливает максимальную глубину рекурсии:
- Обычно 1000 вызовов для CPython
- Может варьироваться в зависимости от реализации и версии Python
Метод | Код |
Использование sys | import sys; print(sys.getrecursionlimit()) |
Использование sys.setrecursionlimit()
- Импортируйте модуль sys
- Установите новое значение лимита
Пример | Описание |
import sys sys.setrecursionlimit(2000) | Увеличивает лимит до 2000 вызовов |
- Преобразование рекурсивного алгоритма в итеративный
- Использование мемоизации для уменьшения глубины рекурсии
- Применение хвостовой рекурсии (хотя Python не оптимизирует ее автоматически)
Параметр | Рекомендация |
Максимальное значение | Не более 10000-30000 для избежания переполнения стека |
Платформа | Значение зависит от доступного размера стека в ОС |
- Итеративное решение: Перепишите алгоритм с использованием циклов
- Генераторы: Используйте yield для управления потоком выполнения
- Стек вручную: Реализуйте стек явно для эмуляции рекурсии
Рекурсивный вариант | Итеративный вариант |
def factorial(n): return 1 if n == 0 else n * factorial(n-1) | def factorial(n): result = 1 for i in range(1, n+1): result *= i return result |
- Установка слишком высокого лимита может вызвать переполнение стека
- Некоторые реализации Python могут игнорировать setrecursionlimit()
- Увеличение лимита не решает проблему неэффективных рекурсивных алгоритмов
Перед увеличением лимита рекурсии рекомендуется рассмотреть возможность оптимизации алгоритма или его перевода на итеративную реализацию.