如何解决斐波那契递归函数
以下程序旨在使用递归函数打印斐波那契数列的前25个项。 我得到了输出,但是问题是程序没有停止,并且一旦变大,它们的值就会变成负值。
#include <stdio.h>
int fibo(int,int,int);
int main()
{
int s,c,i;
s = 1;
c = 0;
i = 0;
fibo(s,i);
}
int fibo(int s,int c,int i)
{
for(i = 0; i <= 25; i++)
{
s = s + c;
c = s - c;
printf("%d\n",s);
fibo(s,i);
}
}
预期输出:
1
2
3
5
8
13
21
34
55
89
144
233
377
610
987
1597
2584
4181
6765
10946
17711
28657
46368
75025
121393
我的输出:
1
2
3
5
8
13
21
34
55
89
144
233
377
610
987
1597
2584
4181
6765
10946
17711
28657
46368
75025
121393
196418
317811
514229
832040
1346269
2178309
3524578
5702887
9227465
14930352
24157817
39088169
63245986
102334155
165580141
267914296
433494437
701408733
1134903170
1836311903
-1323752223
512559680
-811192543
-298632863
-1109825406
-1408458269
1776683621
368225352
2144908973
-1781832971
363076002
-1418756969
-1055680967
1820529360
764848393
-1709589543
-944741150
1640636603
695895453
-1958435240
-1262539787
1073992269
-188547518
885444751
...
解决方法
有两个问题负责您所看到的内容。
第一个问题是函数fibo(s,c,i);
中for循环末尾的递归调用fibo
。您为什么要进行递归调用? for循环本身可以完成所有工作,这里不需要递归。只需删除该行,一切都应该正常工作。
第二个问题是整数溢出。祝贺您,这是您第一次尝试!简短的解释是C类型int
不能代表我们在数学中所知的所有所有整数;只能表示有限范围的整数。斐波那契数列中的整数很快变得很大,无法使用int
类型来充分表示。当像s+c
这样的算术运算产生的结果大于可以表示为int的最大数时,就会发生整数溢出。这是不确定的行为。在大多数情况下(但不是全部),实际行为是整数“环绕”,因此largest_integer + 1 == smallest_integer
以及smallest_integer
当然是负数。
如果在程序中用int
替换每次出现的long long int
,您将可以在序列中看到更多的数字。但是一段时间后,数字仍然会变得太大。
另请参阅:
,此练习的想法是使用递归而不是循环。
尚不清楚您的三个参数应该代表什么({{1},s
和c
可能不是最有用的变量名)。但总的来说,非天真的递归斐波那契实现可能如下所示:
i
并打印前25个数字:
int fib(int n,int prev,int curr) {
if (n == 0) return prev;
if (n == 1) return curr;
return fib(n - 1,curr,curr + prev);
}
注意:这会多余地计算中间结果。要消除此冗余,需要在int main(void) {
for (int i = 0; i < 25; i++) {
printf("fib(%d) = %d\n",i,fib(i,1));
}
}
函数内调用printf
。但是您通常希望避免将计算和IO混在一起,并且上述方法仍然足够有效,因此不需要这样做。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。