【问题标题】:Problems understanding if the following is a tail-recursive function理解以下是否为尾递归函数的问题
【发布时间】:2015-08-07 02:36:06
【问题描述】:

引用wikipedia

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

现在我用 C 编写了以下例程

 int foo (int x){
      if ( x > 100)
          return x-10;
      else 
          return foo(foo(x+11));
 }

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

因此问题:

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

【问题讨论】:

    标签: recursion tail-recursion


    【解决方案1】:

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

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

    【讨论】:

    • 我认为问题是这样的。尽管如此,编译器可以优化最后的递归调用吗?无论如何,说这个函数是尾调用函数是否正确?
    • 是的,一个调用可以被优化,但是如果另一个递归调用仍然存在,这就不那么重要了。您示例中的函数有一个尾调用,是的(根据您引用的定义)。
    猜你喜欢
    • 1970-01-01
    • 2023-03-25
    • 2019-09-14
    • 1970-01-01
    • 1970-01-01
    • 2014-01-28
    • 2011-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多