Почему Python вызывает RecursionError до того, как он превысит реальный предел рекурсии?

Поэтому я пытался поиграть с методами 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()?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
6
0
973
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

В стеке есть вещи до того, как вы вызвали свою функцию.

В этом случае кажется, что в стеке вызовов уже было 20 вызовов, прежде чем вы вызвали recursive.

См. здесь, как анализировать стек, если вам действительно интересно, из чего состоят эти 20 вызовов.

О каких вещах мы говорим? Это какие-то другие статические рекурсивные методы? Потому что он всегда делает это 20 раз до реального числа

DarkSuniuM 07.04.2019 16:55

@DarkSuniuM Это может быть что-то, вызванное вашей средой / IDE, или что-то еще. Вы можете распечатать стек и проанализировать дно, если вам действительно интересно.

Carcigenicate 07.04.2019 16:57

Ваша функция 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, это правильно

DarkSuniuM 07.04.2019 17:06

Другие вопросы по теме