原因是递归和循环的计算顺序不同,导致最终得到的结果也不同。
在你提供的代码中,使用了递归来计算斐波那契数列。其中
fib 函数使用了递归调用来计算第
n 项的值。这种方法是以自上而下的方式计算斐波那契数列,先计算较大的项,然后逐渐向下计算较小的项。具体来说,每次递归调用都会先计算
fib(n-2),再计算
fib(n-1),最后将它们相加。由于递归的方式会重复计算相同的项,所以递归法的效率较低。
而使用循环的方式来计算斐波那契数列可以以自下而上的方式进行。从初始的前两个项开始,通过迭代计算得到后续的项,直到计算到第
n 项。这种方法避免了重复计算,因此循环法的效率较高。
在你的代码中,循环法得到的结果是17710,而递归法得到的结果是17711。这是因为递归法的实现方式导致了计算的顺序不同,最终得到的结果也不同。
如果你想要得到相同的结果,可以在递归法中调用
fib(20) 来计算前20位斐波那契数列之和,而不是
fib(22)。
修复后的代码如下:
- #include<stdio.h>
- int fib(int n);
- int main(){
- int sum = fib(20);
- printf("前20位的斐波那契数列之和为 %d\n", sum);
- return 0;
- }
- int fib(int n){
- if (n == 1 || n == 2)
- return 1;
- else
- return fib(n-2) + fib(n-1);
- }
复制代码
修复后的递归法代码输出结果与循环法相同(17710)。
希望以上解释能帮助到你!