Вопрос-Ответ

What is the maximum recursion depth, and how to increase it?

Какова максимальная глубина рекурсии и как ее увеличить?

У меня здесь есть эта хвостовая рекурсивная функция:

def recursive_function(n, sum):
if n < 1:
return sum
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:

import sys
print(sys.getrecursionlimit())

и измените ограничение рекурсии с помощью sys.setrecursionlimit:

sys.setrecursionlimit(1500)

но делать это опасно - стандартный лимит немного консервативен, но стековые фреймы Python могут быть довольно большими.

Python не является функциональным языком, а хвостовая рекурсия - не особенно эффективный метод. Как правило, лучше переписать алгоритм итеративно, если это возможно.

Ответ 2

Похоже, вам просто нужно установить более высокую глубину рекурсии:

import sys
sys.setrecursionlimit(1500)
Ответ 3

Если вам часто требуется изменять ограничение рекурсии (например, при решении головоломок программирования), вы можете определить простой контекстный менеджер следующим образом:

import sys

class recursionlimit:
def __init__(self, limit):
self.limit = limit

def __enter__(self):
self.old_limit = sys.getrecursionlimit()
sys.setrecursionlimit(self.limit)

def __exit__(self, type, value, tb):
sys.setrecursionlimit(self.old_limit)

Затем для вызова функции с пользовательским ограничением вы можете сделать:

with recursionlimit(1500):
print(fib(1000, 0))

При выходе из тела with инструкции предел рекурсии будет восстановлен до значения по умолчанию.

P.S. Вы также можете захотеть увеличить размер стека процесса Python при больших значениях предела рекурсии. Это можно сделать, например, с помощью ulimit встроенной оболочки или limits.conf(5) файла.

Ответ 4

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

Из документации по Python:


sys.getrecursionlimit()


Возвращает текущее значение предела рекурсии, максимальной глубины стека интерпретатора Python. Это ограничение предотвращает бесконечную рекурсию, вызывающую переполнение стека C и сбой Python. Ее можно задать с помощью setrecursionlimit().


python