c++斐波那契数列递归,超时

##计算斐波那契数列的函数
#题目要求用递归方法,n取0--90,所有运算在30秒内完成
我写的代码运算花费的时间很长,大概在接近50的时候就开始超时了,如何优化一下?

#include <iostream>

using namespace std;

long long fibonacci[91];  //储存已经计算的数列

long long fibonacci_calculate(int n) {
    if (n == 0) { fibonacci[0] = 0; return 0; }
    if (n == 1) { fibonacci[1] = 1; return 1; }
    if (n == 2) { fibonacci[2] = 1; return 1; }
    else { 
        fibonacci[n] = fibonacci_calculate(n - 1)+fibonacci_calculate(n - 2);
        return fibonacci[n];
    }
}
//斐波那契数列的递归函数

int main() {
    int ops=0;  //储存到几的斐波那契数列
    int n;
    while (1) {
    
            cin >> n;  //当前要的项数
            if (cin.fail()) {  //输入的是char型,fail()函数会返回true,进入if
                cin.clear();
                cin.ignore();
                cout << "WRONG" << endl;
            }

            else {   //输入合法
                if (n <= ops) { cout << fibonacci[n] << endl; }  //n<ops直接提取
                else {
                    cout << fibonacci_calculate(n) << endl;
                    ops = n;
                }
                //n>ops,计算斐波那契数列
            }    
    }
    return 0;
}


##问题在于迭代时 fibonacci[i] = fibonacci[i - 1] + fibonacci[i - 2];
这一语句块会使得函数递归分支,加倍递归运算
应只递归一次,把结果储存在数组中,每一次加数组中的数
#改正后代码

#include <iostream>

using namespace std;

long long fibonacci[91] = {0,1};  //初始化斐波那契数组

long long fibonacci_calculate(int n) {
    if (n == 0) {  return 0; }
    if (n == 1) {  return 1; }
    else { 
        {
            fibonacci[n] = fibonacci_calculate(n - 1) + fibonacci[n - 2];//这里进行优化,用数组中的数,不用递归两次
        }
        return fibonacci[n];
    }
}
//斐波那契数列的递归函数

int main() {
    int ops=0;  //储存到几的斐波那契数列
    int n;
    while (1) {
    
            cin >> n;  //当前要的项数
            if (cin.fail()) {  //输入的是char型,fail()函数会返回true,进入if
                cin.clear();
                cin.ignore();
                cout << "WRONG" << endl;
            }
            //如何判断小于90?

            else {   //输入合法
                if (n <= ops) { cout << fibonacci[n] << endl; }  //n<ops直接提取
                else {
                    cout << fibonacci_calculate(n) << endl;
                    ops = n;
                }
                //n>ops,计算斐波那契数列
            }    
    }
    return 0;
}


该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
你的代码使用了递归来计算斐波那契数列,这种方法的时间复杂度是O(2^n),当n较大时,计算速度会非常慢。为了优化这个问题,你可以使用动态规划的方法来降低时间复杂度。

动态规划的思想是将已经计算过的斐波那契数列项存储起来,避免重复计算。这样,在计算第n个斐波那契数时,只需要计算前两个斐波那契数,然后相加即可。这样的时间复杂度为O(n)。

下面是使用动态规划优化后的代码:

#include <iostream>
#include <vector>

using namespace std;

int main() {
    int n;
    vector<long long> fibonacci(91, 0); // 初始化斐波那契数列数组
    fibonacci[0] = 0;
    fibonacci[1] = 1;

    while (cin >> n) { // 输入要计算的斐波那契数列项数
        if (cin.fail()) {
            cin.clear();
            cin.ignore();
            cout << "WRONG" << endl;
        } else {
            if (n <= 87) { // 当n小于等于87时,直接从数组中提取斐波那契数列项
                cout << fibonacci[n] << endl;
            } else { // 当n大于87时,计算斐波那契数列项并输出
                long long result = fibonacci[86] + fibonacci[85];
                cout << result << endl;
            }
        }
    }
    return 0;
}

这样修改后,你的代码应该可以在30秒内完成所有运算。


如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

主要是重复计算太多

#include <iostream>

using namespace std;

long long fibonacci[91] = {0, 1, 1}; // 储存已经计算的数列

auto fibonacci_calculate(int n) -> long long
{
    if (n < 3)
    {
        return fibonacci[n];
    }
    if (fibonacci[n] != 0)
    {
        return fibonacci[n];
    }

    fibonacci[n] = fibonacci_calculate(n - 1) + fibonacci_calculate(n - 2);
    return fibonacci[n];
}
// 斐波那契数列的递归函数

int main()
{
    int ops = 0; // 储存到几的斐波那契数列
    int n;
    while (1)
    {
        cin >> n; // 当前要的项数
        if (cin.fail())
        {         // 输入的是char型,fail()函数会返回true,进入if
            cin.clear();
            cin.ignore();
            cout << "WRONG" << endl;
        }
        else
        { // 输入合法
            if (n <= ops)
            {
                cout << fibonacci[n] << endl;
            } // n<ops直接提取
            else
            {
                cout << fibonacci_calculate(n) << endl;
                ops = n;
            }
            // n>ops,计算斐波那契数列
        }
    }
    return 0;
}

【以下回答由 GPT 生成】

这段代码中,递归算法实现斐波那契数列计算。由于递归的性质,在计算较大的数列时会频繁调用递归函数,导致计算时间过长从而超时。

要优化这个递归算法,可以使用迭代方法来计算斐波那契数列。迭代方法只需要使用两个变量来存储前两个数,然后依次更新这两个变量来计算后面的数,避免了频繁的函数调用。

下面是优化后的代码:

#include <iostream>
using namespace std;

long long fibonacci[91];  //储存已经计算的数列

long long fibonacci_calculate(int n) {
    fibonacci[0] = 0;  // F(0) = 0
    fibonacci[1] = 1;  // F(1) = 1

    for (int i = 2; i <= n; i++) {
        fibonacci[i] = fibonacci[i - 1] + fibonacci[i - 2];
    }

    return fibonacci[n];
}

int main() {
    int ops = 0;  //储存到几的斐波那契数列
    int n;
    while (1) {
        cin >> n;  //当前要的项数
        if (cin.fail()) {  //输入的是char型,fail()函数会返回true,进入if
            cin.clear();
            cin.ignore();
            cout << "WRONG" << endl;
        }
        else {  //输入合法
            if (n <= ops) { 
                cout << fibonacci[n] << endl; 
            } //n<=ops直接提取
            else {
                cout << fibonacci_calculate(n) << endl;
                ops = n;
            }
            //n>ops,计算斐波那契数列
        }  
    }
    return 0;
}

这段代码使用迭代方法计算斐波那契数列,将每个计算结果存储在fibonacci数组中,避免了递归调用。在计算新的项时,直接使用已经计算好的前两个数来计算,而不需要重新计算整个数列。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^