Java中的尾部/前向递归

时间:2010-11-15 20:57:18

标签: java recursion tail-recursion

我不明白为什么这是前向递归:

int count(int x) {
    if(x<=0) return 0;
    return 1 + count(x - 1);
}

这是一个关于练习考试的问题,答案是它的前向递归。为什么会这样?我怎么能区分这两者?

2 个答案:

答案 0 :(得分:8)

你在打电话给自己之后做了一个补充。尾递归意味着绝对没有可以在

之后

如果您了解实施,那么很明显为什么。

假设我们第一次从count致电main0xAAA 0xBBB。然后它完成了大部分方法。我们会说这个堆栈帧的递归调用是0xAAA。如果您正在使用尾递归,那么在调用自身时,它可以将返回地址设置为0xBBC(只需直接转到调用我的代码)。如果之后正在执行任何,则必须将返回地址设置为count(添加的地址)。因为它不需要堆栈帧来存储返回地址,所以将递归转换为迭代也更容易。当int count(int x, int res) { if(x<=0) return res; return count(x - 1, res + 1); } 调用自身时,它可以跳转到方法的开头。

解决方案(对于简单的例子)是在另一个参数中建立结果:

{{1}}

注意我们之后什么都不做。

答案 1 :(得分:4)

你看过this SO question, tail vs forward recursion吗?

马修有答案,长篇名是:

int count(int x) {
  if(x<=0) return 0;
  return 1 + count(x - 1);
}  

可以写成(并扩展为类似的东西):

int count(int x) {
    if(x<=0) return 0;
    int tmp_result = count(x - 1);
    return 1 + tmp_result; // e.g. recursion is not last
}