What is the maximum recursion depth, and how to increase it?
Какова максимальная глубина рекурсии и как ее увеличить?
У меня здесь есть эта хвостовая рекурсивная функция:
defrecursive_function(n, sum): if n < 1: returnsum else: return recursive_function(n-1, sum+n)
c = 998 print(recursive_function(c, 0))
Это работает до n=997, затем оно просто ломается и выплевывает RecursionError: maximum recursion depth exceeded in comparison. Это просто переполнение стека? Есть ли способ обойти это?
Переведено автоматически
Ответ 1
Это защита от переполнения стека, да. Python (или, скорее, реализация CPython) не оптимизирует хвостовую рекурсию, а необузданная рекурсия вызывает переполнение стека. Вы можете проверить предел рекурсии с помощью sys.getrecursionlimit:
но делать это опасно - стандартный лимит немного консервативен, но стековые фреймы Python могут быть довольно большими.
Python не является функциональным языком, а хвостовая рекурсия - не особенно эффективный метод. Как правило, лучше переписать алгоритм итеративно, если это возможно.
Если вам часто требуется изменять ограничение рекурсии (например, при решении головоломок программирования), вы можете определить простой контекстный менеджер следующим образом:
Затем для вызова функции с пользовательским ограничением вы можете сделать:
with recursionlimit(1500): print(fib(1000, 0))
При выходе из тела with инструкции предел рекурсии будет восстановлен до значения по умолчанию.
P.S. Вы также можете захотеть увеличить размер стека процесса Python при больших значениях предела рекурсии. Это можно сделать, например, с помощью ulimit встроенной оболочки или limits.conf(5) файла.
Ответ 4
Это делается для предотвращения переполнения стека. Интерпретатор Python ограничивает глубину рекурсии, чтобы помочь вам избежать бесконечных рекурсий, приводящих к переполнению стека. Попробуйте увеличить предел рекурсии (sys.setrecursionlimit) или переписать свой код без рекурсии.
Возвращает текущее значение предела рекурсии, максимальной глубины стека интерпретатора Python. Это ограничение предотвращает бесконечную рекурсию, вызывающую переполнение стека C и сбой Python. Ее можно задать с помощью setrecursionlimit().