duck_kk 2023-09-19 20:06 采纳率: 50%
浏览 18
已结题

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;
}


  • 写回答

4条回答 默认 最新

  • duck_kk 2023-09-19 22:53
    关注

    ##问题在于迭代时 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;
    }
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 9月27日
  • 已采纳回答 9月19日
  • 创建了问题 9月19日

悬赏问题

  • ¥15 C++ 句柄后台鼠标拖动如何实现
  • ¥15 有人会SIRIUS 5.8.0这个软件吗
  • ¥30 comsol仿真等离激元
  • ¥15 静电纺丝煅烧后如何得到柔性纤维
  • ¥15 (标签-react native|关键词-镜像源)
  • ¥100 照片生成3D人脸视频
  • ¥15 伪装视频时长问题修改MP4的时长问题,
  • ¥15 JETSON NANO
  • ¥15 VS开发qt时如何在paintgl函数中用pushbutton控制切换纹理
  • ¥20 关于 openpyxl 处理excel文件地问题