我正在学习尾递归,在解决这个问题之前,我想对代码片段是否尾递归进行是/否的回答。
int fib_in(int n, int current, int prev) {
if (n == 1 || n == 2) { // n = 1 or 2 both gives fib number 1
return current;
}
return fib_in(n - 1, current + prev, current); // recursive call, current gets updated and new prev is the current, so were going backwards if that makes sense
}
int fib(int n) {
return fib_in(n, 1, 1); // 1 and 1 is the 2 first fib numbers so theyll be used as base cases
}
int main(void) {
int n, f;
printf("the nth number: ");
scanf("%d", &n);
// call fib function
f = fib(n);
printf("%d \n", f);
return 0;
}
我当然认为是这样,但是在我们了解尾部递归之前,我是根据另一项作业分配此功能的,所以我将使用一种我不知道的技术。这就是为什么我有点困惑的原因。
答案 0 :(得分:5)
This answer在解释什么是尾递归方面做得很好。特别注意:
在 tail递归中,您首先执行计算,然后执行递归调用,将当前步骤的结果传递到下一个递归步骤。这导致最后一条语句的格式为
(return (recursive-function params))
。 基本上,任何给定递归步骤的返回值都与下一个递归调用的返回值相同。
再次查看您的代码。您的代码符合此描述吗?
答案 1 :(得分:4)
是的,它是尾递归的。 fib_in()
会自行调用,并且在返回之前不会执行任何其他计算。