Является ли грехом использовать бесконечную рекурсию для бесконечных циклов в Python? - PullRequest
9 голосов
/ 02 ноября 2011

Этот вопрос больше о любопытстве, чем о полезности.Если я пишу функцию, которая должна выполняться вечно, например, демон, как бы Python справился с этим, если бы я снова вызвал функцию с конца функции?

def daemonLoop():

    # Declare locals

    # Do stuff

    daemonLoop()

Я довольноуверен, что выполнение этого в C приведет к переполнению стека, но учитывая уровень абстракции от C до Python, я предполагаю, что вещи обрабатываются по-другому.

Я бы пошел в ад за это?

Ответы [ 6 ]

17 голосов
/ 02 ноября 2011

Почти во всех интерпретаторах Python, которые могут вызвать переполнение стека, как это было бы в C. Функция более высокого уровня, которая позволила бы это, называется Оптимизация вызова Tail или Устранение рекурсии хвоста, и доброжелательный диктатор Python выступает против добавления этого к языку .

Этот стиль считается неидиоматическим для Python, и предпочтителен простой цикл while True:.

5 голосов
/ 02 ноября 2011

Максимальная глубина рекурсии может быть получена с помощью sys.getrecursionlimit() и установлена ​​с помощью sys.setrecursionlimit().

Я бы пошел в ад за это?

Да.У CPython нет устранения хвостовой рекурсии / оптимизации последнего вызова.

def recurse():
    recurse()

recurse()

Ошибка:

  # 1000 or so lines of this:
  File "", line 2, in recurse
RuntimeError: maximum recursion depth exceeded
1 голос
/ 02 ноября 2011

Я не знаю, почему вы думаете о том, чтобы сделать что-то подобное, когда у вас может быть просто бесконечный цикл while.Во всяком случае на ваш вопрос о том, будет ли это работать:

...
  File "test.py", line 7, in daemonLoop
    daemonLoop()
  File "test.py", line 7, in daemonLoop
    daemonLoop()
RuntimeError: maximum recursion depth exceeded

Так что, черт возьми, это так.

1 голос
/ 02 ноября 2011

C-версия интерпретатора Python (который, вероятно, используется), в конечном итоге, приведет к ошибке, если вы никогда не вернетесь с daemonLoop.Я не уверен насчет других версий.

0 голосов
/ 02 ноября 2011
(define forever (lambda () (forever)))

Этот тип рекурсии - то, для чего созданы диалекты Лиспа, такие как Схема!

0 голосов
/ 02 ноября 2011

Наверное, не очень хорошая идея ....

def forever(): forever()

forever()

RuntimeError: превышена максимальная глубина рекурсии

http://paulbarry.com/articles/2009/09/02/infinite-recursion

...