Если bar вызывает bar (i / 2), если i - четное целое число, и bar (3 * i + 1) в противном случае, рекурсивная функциональная bar будет хвостовой рекурсией.
const int bar(const int i)
{
if (i < 2) return i;
return i % 2 ? bar(i/2) : bar(3*i + 1);
}
Однако что, если bar вызывает либо bar, либо foo, у которого набор локальных переменных полностью отличается от bar?
const int bar(const int i)
{
if (i < 2) return i;
return i % 2 ? bar(i/2) : foo(3*i + 1);
// where foo is very complicated recursive call that has
// 11 different user-defined/primitive type of
// local variables that can't be optimized out
}
Насколько я понимаю, оптимизация хвостовой рекурсии будет использовать стек вызывающего. Вызывающий объект уже обработал свои локальные переменные перед вызовом вызываемого. Итак, вызываемый может использовать его повторно. Насколько я понимаю, звучит хорошо, когда вызывающий и вызываемый - это одна и та же функция (например, foo вызывает foo, bar вызывает bar). Однако, если размер и макет стека совершенно разные, а вызываемые могут быть одной из нескольких разных функций с разным макетом стека, что произойдет?
Во-первых, будет ли это хвостовая рекурсия? (Теперь я понимаю, что может быть применена оптимизация хвостового «вызова», но это не хвостовая «рекурсия».) Во-вторых, основные компиляторы, такие как gcc, clang и т. Д., Будут оптимизировать этот вид хвостовых вызовов? (Кажется, да.)
Что, если вызываемый объект (foo во втором примере кода) намного сложнее? Если вызываемый и вызывающий вызывают друг друга (взаимная рекурсия), будет ли вызов в моем втором примере кода оптимизирован для хвостового вызова? Если вызываемый (например, foo) представляет собой сложный рекурсивный вызов, который определенно не является хвостовой рекурсией и компилятору очень сложно сократить его до цикла или около того, будет ли он по-прежнему оптимизирован для хвостового вызова?
foo()
изbar()
не является рекурсией. Так что я не вижу актуальности. - person Disillusioned   schedule 21.03.2018foo()
не заменяют демонстрацию.) Итак: Какова ваша точка зрения? OP не демонстрирует какой-либо рекурсии сfoo()
. Так что я все еще не вижу актуальности. - person Disillusioned   schedule 21.03.2018foo()
. Если OP хочет спросить об оптимизации хвостовой рекурсии с взаимной рекурсией, тогда минимальный воспроизводимый пример (с акцентом на Complete) должен указывать на рассматриваемую взаимную рекурсию. В противном случае речь идет о безграничной игре в рулетку с множеством гипотетических реализацийfoo()
; делая вопрос слишком широким. - person Disillusioned   schedule 21.03.2018