2015-07-06 4 views
1

Пожалуйста, помогите исправить мое понимание, которое заключается в том, что оптимизация хвостового вызова работает только для рекурсивных вызовов. Меня смущает то, что этот термин - это просто «оптимизация хвостового вызова», а не «рекурсивная оптимизация хвостового вызова».Оптимизируется ли оптимизация вызовов для вызовов, отличных от рекурсивных вызовов?

Или есть ли какая-то другая оптимизация, которая возникает для хвостовых вызовов вообще, на что относится этот термин?

+1

Теоретически он может использоваться для любых вызовов хвоста. Но поскольку чем глубже цепочка вызовов, тем больше преимуществ вы получаете, это, как правило, наиболее полезно для рекурсии. – biziclop

ответ

3

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

Встраивание метода может быть легко выполнено для любого рекурсивного вызова, даже если это не сам метод.

Особое преимущество для нее было бы для взаимных рекурсивных вызовов:

f(n): 
    //some code 
    g(n) 
g(n): 
    //some more code 
    f(n-1) 

Вопрос заключается в том, «что и как оптимизировать», мы должны просто «отменить» г, и сделать ф рекурсивными?

К счастью, эта проблема относительно проста и может быть решена с помощью простых алгоритмов графа, благодаря тому, что каждый метод является узлом - он имеет не более одного исходящего края (один хвостовой вызов). Это означает, что граф фактически представляет собой цепочку цепей, которые образуют простой цикл (один цикл в каждой подключенной компоненте) в «худшем случае», который легко обрабатывать.

+0

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

+0

@PascalCuoq Исправление принято. Спасибо за ответ. – amit

 Смежные вопросы

  • Нет связанных вопросов^_^