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