...尾调用是作为过程的最终操作执行的子例程调用。如果尾调用可能导致在调用链中稍后再次调用相同的子例程,则子例程被称为尾递归,这是递归的特殊情况。
现在我用C
编写了以下例程 int foo (int x){
if ( x > 100)
return x-10;
else
return foo(foo(x+11));
}
根据上面的定义,在我看来,foo应该是一个尾递归函数,因为它的递归调用是过程的最后一个动作,但我曾经读过一些地方,这不是一个尾递归函数。
因此问题:
为什么这个函数不是尾递归的?
答案 0 :(得分:1)
此函数通常不被视为尾递归,因为它涉及对foo
的多次递归调用。
尾递归特别有趣,因为它可以简单地重写(例如通过编译器优化)到循环中。在您的示例中,使用此尾调用优化技术无法完全消除递归,因此即使其最后一个语句是递归调用,也不会将此函数视为尾递归。