【问题标题】:The difference between head & tail recursion [duplicate]头尾递归的区别[重复]
【发布时间】:2014-02-20 23:55:17
【问题描述】:

我试图找出这两种递归策略之间的区别。

我被告知的定义如下:

尾递归:如果调用返回后无需执行任何操作,即调用返回时,调用函数立即返回返回值,则调用是尾递归的

头递归:当函数的第一条语句是递归调用时,调用就是头递归。

【问题讨论】:

  • “头部递归”不是我以前听说过的东西。这听起来不是一个有用的概念。递归调用成为函数所做的第一件事是极其罕见的。这排除了任何类型的条件来确定是否执行调用以及在函数调用之前需要评估的任何参数。在某些语言中,这甚至是不可能的,因为函数必须在运行时计算表达式以确定递归调用的函数。
  • 谷歌搜索。看起来使用该术语的来源对“头部”的定义非常宽松,大致意思是在“实际工作”之前。我不确定他们为什么要定义“头部递归”;他们似乎与这个概念没有任何关系。它肯定不如尾递归有用。
  • 区分头递归和非尾递归似乎是多余的。
  • @user2357112:请原谅迟到的回复,但是头递归和尾递归之间的区别很重要,因为它可能会影响内存。在递归调用之前计算的任何东西都必须存储在堆栈中,直到计算出整个后续递归函数。某些系统需要更多内存,因此对于尾递归,不能进行深度递归并且可能会出错。头递归只是将函数的结果向前传递到下一次计算迭代,因此一次只需要存储一个值。
  • @MichaelKupietz:你搞错了。尾递归可以优化以消除无限调用堆栈增长,并且一些函数式编程语言强制执行此操作。 “头递归”需要维护调用堆栈信息,防止这种优化。

标签: java recursion difference


【解决方案1】:

head recursion 中,当递归调用发生时,它先于函数中的其他处理(想想它发生在函数的顶部或头部)。

tail recursion 中,情况正好相反——处理发生在递归调用之前。在两种递归样式之间进行选择似乎是任意的,但选择可以使一切变得不同。

在路径开头有一个递归调用的路径的函数使用所谓的头递归。前一个展览的阶乘函数使用了头递归。一旦确定需要递归,它做的第一件事就是使用递减的参数调用自身。 在路径末尾具有单个递归调用的函数正在使用尾递归。 Refer this article

递归示例:

public void tail(int n)         |     public void head(int n)
{                               |     {
    if(n == 1)                  |         if(n == 0)
        return;                 |             return;
    else                        |         else
        System.out.println(n);  |             head(n-1);
                                |
    tail(n-1);                  |         System.out.println(n);
}                               |     }

如果递归调用发生在方法的末尾,则称为tail recursion。尾递归是similar to a loopmethod executes all the statements before jumping into the next recursive call

如果递归调用发生在beginning of a method, it is called a head recursionmethod saves the state before jumping into the next recursive call

【讨论】:

  • 嗯...尾递归是一个单独的东西。尾调用优化是一种可应用于尾递归的优化。它们与您第一段中暗示的不同。
  • 这些基本上不只是OP自己声明的定义吗?
  • 可以举一个头部递归的例子吗?因为在我看来,让方法的第一行立即调用递归会导致无限循环,不是吗?像 int recurCall(int number) { int res = recurCall(number -1); ...过程...;返回资源; }.
  • @Sara - 我已经给出了理论和示例的区别。查看示例后面的段落,它显示了您想要的内容。
  • @JavaCuriousღ 好的,谢谢!
猜你喜欢
  • 1970-01-01
  • 2020-04-11
  • 1970-01-01
  • 2016-09-19
  • 2012-10-07
  • 2017-06-30
  • 1970-01-01
  • 1970-01-01
  • 2019-06-02
相关资源
最近更新 更多