Я понимаю, что ответ на этот вопрос может отличаться для разных языков, а язык, который меня больше всего интересует, - это C++. Если тег должен быть изменен, потому что на него нельзя ответить агностическим языком, не стесняйтесь. Может ли частично функция хвостовой рекурсии по-прежнему получать преимущества оптимизации полностью хвостовой рекурсивной функции?
Возможно ли, чтобы функция была частично хвостовой рекурсивной и по-прежнему получила какое-либо преимущество в том, что вы получите хвост-рекурсив?
Как я понимаю, хвостовая рекурсия - это то место, где вместо полного вызова функции компилятор будет оптимизировать функцию, чтобы просто изменить аргументы вместо новых аргументов и перейти к началу функции.
Если у вас есть функция, как это:
def example(arg):
if arg == 0:
return 0 # base case
if arg % 2 == 0:
return example(arg - 1) # should be tail recursive
return 3 + example(arg - 1) # isn't tail recursive because 3 is added to the result
Когда Оптимизатор встречает что-то подобное (где функция является хвостовой рекурсией в некоторых случаях и не в других) он будет превратить один в jump
а другой - в call
, или будет какой-то факт оптимизационной реальности (если бы я знал, что я не прошу), заставить его превратить все в call
и потерять всю эффективность, которую вы могли бы иметь, рекурсивная?
Да, я знаю, что могу изменить его там, где он безусловно рекурсивный, но я хотел привести пример того, о чем я говорил. И да, я уверен, что C++ (по крайней мере, MSVC++) может превратить взаимно рекурсивные функции в хвостовые вызовы. –
Реализация CPython * никогда * не оптимизирует хвостовые звонки, и Гвидо положил свою ногу на эту тему, назвав ее «бессовестной». См. Http://neopythonic.blogspot.com/2009/04/tail-recursion-elimination.html –
@ Dietrich да, я заметил это, когда я попытался, что должно было быть хвостовой рекурсивной факторной функцией :) слишком плохого guido так недальновидный. –