繁体   English   中英

Java中的尾部/前向递归

[英]Tail/forward recursion in Java

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

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

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

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

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

假设我们第一次从main调用count ,这是在程序计数器 0xAAA 然后它完成了大部分方法。 我们将说这个堆栈帧的递归调用计数为0xBBB 如果您正在使用尾递归,则在调用自身时,它可以将返回地址设置为0xAAA (直接转到调用我的代码)。 如果之后正在执行任何操作 ,则必须将返回地址设置为0xBBC (添加的地址)。 因为它不需要堆栈帧来存储返回地址,所以将递归转换为迭代也更容易。 count调用自身时,它可以跳转到方法的开头。

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

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

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

您是否看过这个问题,尾部与前向递归

马修有答案,长篇大论就是:

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
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM