Что это означает на языке «Не имеет оптимизации хвостового вызова» [дубликат]

Вам придется постоянно опробовать страницу, которая имеет значение из базы данных.

144
задан Jordan Mack 27 November 2012 в 21:53
поделиться

6 ответов

Нет, и это никогда не будет, так как Гвидо предпочитает иметь надлежащие трассировки

http://neopythonic.blogspot.com.au/2009/04/tail-recursion-elimination .html

http://neopythonic.blogspot.com.au/2009/04/final-words-on-tail-calls.html

Вы можете вручную исключить рекурсию с таким преобразованием

>>> def trisum(n, csum):
...     while True:                     # change recursion to a while loop
...         if n == 0:
...             return csum
...         n, csum = n - 1, csum + n   # update parameters instead of tail recursion

>>> trisum(1000,0)
500500
151
ответ дан John La Rooy 15 August 2018 в 20:35
поделиться
  • 1
    Или, если вы собираетесь его трансформировать - просто: from operator import add; reduce(add, xrange(n + 1), csum)? – Jon Clements♦ 27 November 2012 в 22:10
  • 2
    @JonClements, который работает в этом конкретном примере. Преобразование в цикл while работает для рекурсии хвоста в общих случаях. – John La Rooy 7 October 2013 в 00:56
  • 3
    +1 Для правильного ответа, но это похоже на невероятно костяное дизайнерское решение. Причины , данные , похоже, сводятся к «трудно сделать, учитывая, как интерпретируется python, и мне это все равно не нравится». – Basic 4 September 2014 в 19:36
  • 4
    @jwg Итак ... Что? Вы должны написать язык, прежде чем сможете прокомментировать плохие дизайнерские решения? Вряд ли кажется логичным или практичным. Я полагаю из вашего комментария, что у вас нет мнения о каких-либо особенностях (или их отсутствии) на любом языке, когда-либо написанном? – Basic 20 January 2016 в 16:35
  • 5
    @Basic Нет, но вам нужно прочитать статью, которую вы комментируете. Кажется, очень сильно, что вы на самом деле не читали его, учитывая, как он «сводится» и т. Д. тебе. (Наверное, вам, вероятно, нужно будет прочитать обе связанные статьи, так как некоторые аргументы распространяются по обоим.) Это почти не имеет никакого отношения к реализации языка, но все, что связано с предполагаемой семантикой. – Veky 26 October 2016 в 04:14

Слово Гвидо находится в http://neopythonic.blogspot.co.uk/2009/04/tail-recursion-elimination.html

I недавно опубликовал запись в моем блоге истории Python о происхождении функциональных возможностей Python. Боковое замечание об отсутствии поддержки устранения хвостовой рекурсии (TRE) сразу вызвало несколько комментариев о том, что жаль, что Python этого не делает, включая ссылки на недавние записи в блоге другими, пытающимися «доказать», что TRE можно добавить в Python без труда. Поэтому позвольте мне защищать свою позицию (а это то, что я не хочу TRE на языке). Если вы хотите получить короткий ответ, это просто непитоносно. Вот длинный ответ:

19
ответ дан Jon Clements 15 August 2018 в 20:35
поделиться
  • 1
    И здесь проблема с так называемым BDsFL. – Adam Donahue 6 November 2014 в 21:43
  • 2
    @AdamDonahue, вы были полностью удовлетворены каждым решением, которое принято в комитете? По крайней мере, вы получаете обоснованное и авторитетное объяснение от BDFL. – Mark Ransom 11 November 2014 в 21:22
  • 3
    Нет, конечно, нет, но они поразили меня как более безответную. Это от предписчика, а не от дескриптивиста. Ирония. – Adam Donahue 17 November 2014 в 01:49

Попробуйте экспериментальную реализацию macropy TCO для размера.

3
ответ дан Mark Lawrence 15 August 2018 в 20:35
поделиться

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

6
ответ дан recursive 15 August 2018 в 20:35
поделиться
  • 1
    вы имеете в виду Python? – iabdalkader 27 November 2012 в 22:00
  • 2
    @mux CPython - эталонная реализация языка программирования Python. Существуют и другие реализации (такие как PyPy, IronPython и Jython), которые реализуют один и тот же язык, но отличаются деталями реализации. Различие здесь полезно, потому что (теоретически) можно создать альтернативную реализацию Python, которая делает TCO. Я даже не подозреваю, что кто-то даже подумает об этом, и полезность будет ограничена, поскольку код, основанный на ней, будет разбит на все другие реализации Python. – user 27 November 2012 в 22:06
  • 3
    @delnan спасибо за объяснение :) – iabdalkader 27 November 2012 в 22:13
122
ответ дан Thomas Baruchel 15 August 2018 в 20:35
поделиться

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

import sys
sys.setrecursionlimit(5500000)
print("recursion limit:%d " % (sys.getrecursionlimit()))
1
ответ дан zhenv5 15 August 2018 в 20:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: