我正在尝试理解这两种递归策略的区别。
我被告知的定义如下:
- 尾递归:如果在调用返回后不需要进行任何操作,则此调用为尾递归,即当调用返回时,返回值会立即从调用函数返回。 - 头递归:当函数的第一个语句是递归调用时,此调用为头递归。
我被告知的定义如下:
- 尾递归:如果在调用返回后不需要进行任何操作,则此调用为尾递归,即当调用返回时,返回值会立即从调用函数返回。 - 头递归:当函数的第一个语句是递归调用时,此调用为头递归。
在头递归中,递归调用发生时会在函数中的其他处理之前发生(可以将其想象为在函数顶部或头部进行)。
在尾递归中则相反——处理发生在递归调用之前。选择两种递归样式似乎是任意的,但选择可能会产生很大的区别。
具有路径上单个递归调用的函数在路径开头使用所谓的头递归。先前展示的阶乘函数使用了头递归。一旦它确定需要递归,它第一件要做的事情就是使用递减参数调用自己。
在路径末尾具有单个递归调用的函数使用尾递归。 参考这篇文章
递归示例:
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);
} | }
如果递归调用发生在方法的结尾,它被称为尾递归。尾递归类似于循环。该方法在跳入下一个递归调用之前执行所有语句。
如果递归调用发生在方法的开头,它被称为头递归。该方法在跳入下一个递归调用之前保存状态。