理解以下是否是尾递归函数的问题

时间:2015-05-25 15:09:57

标签: recursion tail-recursion

引自wikipedia

  

...尾调用是作为过程的最终操作执行的子例程调用。如果尾调用可能导致在调用链中稍后再次调用相同的子例程,则子例程被称为尾递归,这是递归的特殊情况。

现在我用C

编写了以下例程
 int foo (int x){
      if ( x > 100)
          return x-10;
      else 
          return foo(foo(x+11));
 }

根据上面的定义,在我看来,foo应该是一个尾递归函数,因为它的递归调用是过程的最后一个动作,但我曾经读过一些地方,这不是一个尾递归函数。

因此问题:

  

为什么这个函数不是尾递归的?

1 个答案:

答案 0 :(得分:1)

此函数通常不被视为尾递归,因为它涉及对foo的多次递归调用。

尾递归特别有趣,因为它可以简单地重写(例如通过编译器优化)到循环中。在您的示例中,使用此尾调用优化技术无法完全消除递归,因此即使其最后一个语句是递归调用,也不会将此函数视为尾递归。