尾递归,后面的代码片段尾递归吗?

问题描述 投票:0回答:2

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

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

我当然认为是的,但是在了解尾递归之前,我是为了响应另一项作业而创建此功能的,所以我将使用一种我不知道的技术。这就是为什么我有点困惑的原因。

c recursion tail-recursion
2个回答
4
投票

This answer很好地解释了什么是尾递归。特别注意:

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

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


2
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.