Поэтому я пытался поиграть с методами sys.getrecursionlimit()
и sys.setrecursionlimit()
.
По умолчанию предел рекурсии был 3000
.
Я попытался проверить это с помощью этого кода:
def recursive(n):
print(n)
recursive(n+1)
recursive(0)
Он печатает числа в 2979
, задерживается на секунду, печатает 2980
и затем поднимает RecursionError
RecursionError: maximum recursion depth exceeded while calling a Python object
Я знаю, что ошибка должна возникать, когда она превышает предел рекурсии, который возвращает sys.getrecursionlimit()
, но это не так.
Похоже, он всегда делает это 20 раз до предела рекурсии.
Я также пробовал это:
sys.setrecursionlimit(100)
def recursive(n):
print(n)
recursive(n+1)
recursive(0)
Он по-прежнему делает то же самое, печатает все числа в 79
, задерживается на секунду, печатает 80
, а затем выдает ту же ошибку.
Почему это вызывает ошибку до того, как она превысит реальный предел рекурсии, который мы установили или достигли sys.getrecursionlimit()
?
В стеке есть вещи до того, как вы вызвали свою функцию.
В этом случае кажется, что в стеке вызовов уже было 20 вызовов, прежде чем вы вызвали recursive
.
См. здесь, как анализировать стек, если вам действительно интересно, из чего состоят эти 20 вызовов.
@DarkSuniuM Это может быть что-то, вызванное вашей средой / IDE, или что-то еще. Вы можете распечатать стек и проанализировать дно, если вам действительно интересно.
Ваша функция recursive()
— не единственный компонент, который учитывается в пределе. Некоторые внутренние функции Python также увеличивают значение счетчика, потому что код Python также может вызывать их несколько раз. Функция print()
— одна из них.
Суть в том, что ограничение рекурсии распространяется не только на написанные вами функции Python. Это относится к весь стек вызовов.
На самом деле, рекурсивная функция "ALONE" вызывается ровно max=3000 раз, пока вы удаляете функцию "print". Это связано с тем, что встроенные функции Python также вносят свой вклад в ограничение.
import sys
count = 0
def recursive(n):
global count
count = count + 1
recursive(n+1)
sys.setrecursionlimit(3000)
try:
recursive(0)
except:
print count # would print 2999
Это объясняет больше. Тем не менее, ваш код для меня останавливается на 2984 :D В любом случае спасибо, согласно ссылке, отправленной @Carcigenicate, это правильно
О каких вещах мы говорим? Это какие-то другие статические рекурсивные методы? Потому что он всегда делает это 20 раз до реального числа