Подтвердить что ты не робот

Объясните мне, какое большое значение имеет оптимизация хвостовых вызовов и почему Python это нуждается

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

Чтобы это стало понятным для меня, может ли кто-нибудь дать мне фрагмент кода, который будет значительно упрощен с использованием TCO?

4b9b3361

Ответ 1

Лично я уделяю большое внимание оптимизации хвостового вызова; но главным образом потому, что он делает рекурсию такой же эффективной, как итерация (или делает итерацию подмножеством рекурсии). На минималистических языках вы получаете огромную выразительную силу, не жертвуя успехом.

На "практическом" языке (например, Python), OTOH, у вас обычно есть много других конструкций практически для любой ситуации, которую можно себе представить, поэтому она менее критична. Всегда хорошая вещь, чтобы иметь возможность непредвиденных ситуаций, конечно.

Ответ 2

Если вы сильно хотите использовать рекурсию для вещей, которые могут альтернативно быть выражены как циклы, тогда "оптимизация хвостовых вызовов" действительно необходима. Тем не менее, Guido, Python Benevolent Dictator For Life (BDFL), сильно верит в то, что петли выражаются в виде циклов, поэтому он не собирается обращаться к специальным хвостовым вызовам (жертвуя стеками следов стека и регулярностью отладки).

Ответ 3

Оптимизация хвостовых вызовов упрощает запись рекурсивных функций, не беспокоясь о переполнении стека:

def fac(n, result=1):
        if n > 1:
                return fac(n - 1, n * result)
        return result

Без оптимизации хвостового вызова, вызов этого с большим числом может переполнить стек.

Ответ 4

Я уже много лет думаю на ваш вопрос (верьте или нет...). Я был так глубоко инвестирован в этот вопрос, что, наконец, написал целую статью (которая также представляет собой один из моих модулей, которые я написал несколько месяцев назад, не тратя времени на то, чтобы написать точное объяснение, как это сделать). Если вас еще интересует этот вопрос, прочитайте мой ответ в своем блоге . В двух словах я даю презентацию модуля tco; вы не найдете ничего, что вы уже не можете сделать без устранения хвостовой рекурсии, но вас могут заинтересовать мои мысли об этом.

Я знаю, что простые ссылки не являются предпочтительным использованием в Stackoverflow; пожалуйста, обратите внимание, однако, что я написал целую статью для ответа на этот пост (который я упоминаю в теле моей статьи), включая также некоторые иллюстрации для иллюстрации. По этой причине я пишу здесь этот необычный ответ.

Ответ 5

Гвидо признал в дальнейшем post, что TCO разрешило очистке реализацию конечного автомата как совокупность функций, рекурсивно вызывающих друг друга. Однако в том же посте он предлагает альтернативное решение с равной степенью очистки без TCO.