递归斐波纳契

时间:2011-09-17 07:06:03

标签: c fibonacci

我正在尝试生成Fibonacci系列并提供以下相同的代码。当我为较小的值运行此代码时,它会输出正确的结果。但是,当我尝试计算一个数字为'50'的系列时,它会将正确的结果输出到第47个数字,而48,49和50个结果的结果是不正确的。我尝试使用unsigned long int,但它没有更正结果。有人可以在这里建议我做错了什么。 谢谢。

#include<stdio.h>
unsigned long long int fibr(unsigned long long int);

int main(){
    unsigned long long  int n;
    printf("Enter a number\n");
    scanf("%llu",&n);
    //res=fibr(n);
      while(n>=0){
          printf("%llu\n",fibr(n));
          n--;
           }
     }
unsigned long long int fibr(unsigned long long int n){
     if((n==0)||(n==1))
         return n;
     else return fibr(n-1)+fibr(n-2);
     }

'建议之后,我整合了unsigned long long int。修改了上面的代码,但现在它给出了一个seg错误。请给我任何提示。除了可用的标准之外,我不允许使用任何其他库。 “

5 个答案:

答案 0 :(得分:2)

您是否尝试使用unsigned long long

答案 1 :(得分:1)

以下是第二个问题的答案:

我认为你从一开始就遇到了这个问题:

while(n>=0){

是一个无限循环,因为n是无符号整数。由于减少,n将变为负数。但是由于它是无符号的,它会回绕并导致递归中的堆栈溢出。

此外,您的算法可能是执行此操作的最慢方法。它以指数时间运行。因此,当n很大时,运行它需要很长时间。

更好的方法是:

int n = 48;
return (unsigned long long)(pow(1.6180339887498948,n) * 0.44721359549995794 + 0.5);

此方法将在恒定时间内运行。 :)

答案 2 :(得分:0)

C数据类型的大小有限。因此,如果您使用intlonglong long,由于斐波那契数字的快速增长特性,您的结果将会溢出。 要存储这么大的数字,您需要一些BigInteger实现。为此,请查看“BigInt” in C?

答案 3 :(得分:0)

你得到整数溢出。对于unsigned int,最大可能值为4294967295,但第48个斐波纳契数为4807526976。

答案 4 :(得分:0)

fibr()转换为memoize其结果会将fibr(90)的运行时间缩短到几毫秒。从递归切换到迭代应该有类似的结果。