我不明白为什么这是前向递归:
int count(int x) {
if(x<=0) return 0;
return 1 + count(x - 1);
}
这是一个关于练习考试的问题,答案是它的前向递归。为什么会这样?我怎么能区分这两者?
答案 0 :(得分:8)
你在打电话给自己之后做了一个补充。尾递归意味着绝对没有可以在
之后如果您了解实施,那么很明显为什么。
假设我们第一次从count
致电main
,0xAAA
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
}