递归Fibonacci序列

时间:2011-03-31 17:05:09

标签: c++ recursion fibonacci

所以我编写了一个递归程序,询问用户现在要执行的许多Fibonacci数。我遇到的问题是,在第45个数字之后,它给了一个带“ - ”的数字和一个不符合序列的数字。我怎样才能改变它以给我正确的号码?以下是执行计算的代码的递归部分:

void fibonacci (int a, int b, int n, int count)
{
    if(n < count) 
    {
        cout<<a+b<<endl;
        fibonacci(b, a+b, n+1, count);
    }
}

这是序列的输出:

How many numbers do you want the Fibonacci sequence to process: 50
The starting numbers for the sequence are: 0, 1
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

我需要做些什么更改才能将 - #更改为实数?

4 个答案:

答案 0 :(得分:9)

您遇到了问题,因为您使用的datatype int为32位,signed时只能保存最多2 ^ 31-1 = 2147483647的值(默认值) ,使用31位,占用1位表示signedness,这也解释了负数),unsigned时为2 ^ 32-1 = 4294967295。你可以在这里使用64位数据类型(在大多数情况下是long long),但是稍后也会遇到这个问题(我认为在第94个斐波那契数字附近)。

这个问题的“真实”解决方案是编写自己的数值计算方法,并使用自己的数字表示,例如。一系列的字符。您还可以查找使用“bignum”库的各种可能性之一。您应该在一些SO问题中找到有关此问题的更多信息,例如this one

答案 1 :(得分:1)

将您的变量声明为unsigned int将允许您进行更多交互,但无论如何您都会遇到问题。使用long long int扩展变量的大小仍会延迟您的问题。你无法解决这个问题,因为你迟早会超过你能代表的最大数量,无论你选择哪种数据类型

答案 2 :(得分:0)

Ints仅保存32位数据,最大值为2,147,483,647。您的返回值是“溢出”。使用ulong数据类型,该类型包含64位,最大值为18,446,744,073,709,551,615。

答案 3 :(得分:0)

使用双精度类型,因为int类型将很快溢出,以适度地计算斐波那契数。大数应使用双浮点数中的指数表示法。

由于您使用的是先前的数字,因此每次下一次循环迭代都将其上移一个,因此使用fibonacci(a,a + b,n + 1,count)而不是fibonacci(b,a + b,n + 1,计数)。我编写了自己的递归函数,该递归函数较少递归,它将说明为什么使用不同的递归调用来使逻辑更清晰。

我编写的递归函数显示斐波那契数中非浮点数溢出的速度。

// ConsoleApplication1.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
#include <conio.h>
using std::cout;
using std::endl;

int fibonacci(double n, int count) {
    char ch;
    static double lastnminus1, lastnminus2;
    if (n == 1) {
     lastnminus1 = 1;
     lastnminus2 = 0;
    }
    cout << lastnminus1 + lastnminus2 << endl;
    double temp = lastnminus1;
    lastnminus1 = lastnminus1 + lastnminus2;
    lastnminus2 = temp;
    if (static_cast<int>(n) % 24 == 0) { 
        cout << "press a key" << endl;
        ch = getch();
    }
    if ( n < count)
        fibonacci(n+1,count);

    return 0;
}

int main()
{
    fibonacci(1,200);
    return 0;
}