c - 通过子程序返回值

标签 c recursion

贝娄是一个简单的代码,用户给出一个数字,它会找到直到该数字的斐波那契数列。问题是,如果我们给出例子 5。 首先,它会运行直到到达 Nth_Fib_number = Fib_n(i)。 然后它进入子程序,因为 i=0;(来自主程序的循环)然后 res=0; 并返回 res; 这是 0 。 其次,我们得到 i=1;(来自主程序的循环),然后 res=1;它返回 res;即 1。

让我困惑的部分现在是 i=2; 它通过子程序并导航到 res=Fib_n(n-1)+Fib_n(n-2) 。我猜这里 res=1+0 。 之后它会转到 res=1; 然后返回 res; 之后它再次转到 res=0; 并返回 res; 之后,它再次返回 res; 一次,然后转到 main。

问题是我无法理解第三个循环中发生的情况。我们得到 res=Fib_n(2-1)+Fib_n(2-2);,之后它再次调用自身并表示 res=1;。为什么 res 等于 1?另外,当它立即返回res时,它是否返回值为3的res?

我尝试调试它,但没能看到我想要的变量。

很抱歉这篇文章很长。感谢您的宝贵时间,感谢您的帮助。

#include <stdio.h>
int Fib_n( int n);
int main( void )
{ 
    int Nth_Fib_number, i, n;
    printf("Give a number N, in order to get the Fib(N):\n");
    scanf("%d", &n);

    for (i=0; i<=n; i++)
    {
        Nth_Fib_number = Fib_n( i );
        printf("%d: Fibonacci( %d ) = %d\n", i, i, Nth_Fib_number);
    }
}

int Fib_n( int n)
{
    int res;

    if (n==0){
        printf("%d",res);
        res = 0;
    }else
        if (n==1)
            res = 1;
        else
            res = Fib_n(n-1) + Fib_n(n-2);
    return res;
}

最佳答案

问题在于您在变量初始化之前打印了值。那是未定义的行为。请记住,每次调用 Fib_n 时,它都会有一个新的 res 变量,该变量与之前的调用完全无关。

另外,你的代码看起来很困惑。您确实应该在 else block 周围放置大括号,如下所示:

}else {
    if (n==1)
        res = 1;
    else
        res = Fib_n(n-1) + Fib_n(n-2);
}

但是在我看来,代码无论如何看起来都很困惑。我会这样写:

int Fib_n(int n)
{
    if(n==0) return 0;
    if(n==1) return 1;
    return Fib_n(n-1) + Fib_n(n-2);
}

像这样简单的函数不需要单独的返回变量。

关于c - 通过子程序返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60058750/

相关文章:

algorithm - 你如何找到像这个这样的递归函数的空间复杂度?

c - 返回一个值作为输出参数

c - 在这里,我试图填充 StudentList,它是一个数组。目前我只显示了 2 个学生,但出现段错误

c - "cannot find -lcrypto -lssl"在 Windows 上使用 OpenSSL 并使用 MinGW

c - GetTextMetrics 为 Courier New 返回不同的最大和平均字符宽度

java - java中的深度优先搜索——如何回到父节点?

c - 使用函数返回指针作为左值

unit-testing - 在 Jest 中测试递归调用

r - 具有不等大小组的高效递归随机抽样

Java递归: Determine how many numbers in an array is greater than index 1