贝娄是一个简单的代码,用户给出一个数字,它会找到直到该数字的斐波那契数列。问题是,如果我们给出例子 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/