尾递归,跟随片段尾递归吗?

时间:2019-11-17 23:27:17

标签: c recursion tail-recursion

我正在学习尾递归,在解决这个问题之前,我想对代码片段是否尾递归进行是/否的回答。

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;
}

我当然认为是这样,但是在我们了解尾部递归之前,我是根据另一项作业分配此功能的,所以我将使用一种我不知道的技术。这就是为什么我有点困惑的原因。

2 个答案:

答案 0 :(得分:5)

This answer在解释什么是尾递归方面做得很好。特别注意:

  

tail递归中,您首先执行计算,然后执行递归调用,将当前步骤的结果传递到下一个递归步骤。这导致最后一条语句的格式为(return (recursive-function params))基本上,任何给定递归步骤的返回值都与下一个递归调用的返回值相同

再次查看您的代码。您的代码符合此描述吗?

答案 1 :(得分:4)

是的,它是尾递归的。 fib_in()会自行调用,并且在返回之前不会执行任何其他计算。