为啥小弟我的电脑计算下列程序很慢

为啥我的电脑计算下列程序很慢?C/C++ code#includeiostreamusing std::coutusing std::endlusing std:

为啥我的电脑计算下列程序很慢?

C/C++ code
#include<iostream>using std::cout;using std::endl;using std::cin;long fib(long n){    if(n>2)    return fib(n-1)+fib(n-2);    else    return 1;}int main(void){    int N;    cout<<"请输入所求斐波拉契数列的项数N:"<<endl;    cin>>N;    cout<<"第N项斐波拉契数列为:"<<fib(N);    return 1;}

当N取40的时候,大概等几秒还能算,但是当N>50之后,就不行了。这是为什么?有没有优化办法?

[解决办法]
递归很耗性能,当n变大的时候出入栈的次数会急剧增加,所以会很慢。想要快一点就写个非递归算法
[解决办法]
std::map<int,long> fibMap;

long fib(long n)
{
std::map<int,long>::iterator itr = fibMap.find(n);
if(itr != fibMap.end())
{
return itr->second;
}
if(n>2)
{
int ret = 1;
ret = fib(n-1)+fib(n-2);
fibMap[n] = ret;
return ret;
}
else
{
fibMap[n] = 1;
return 1;
}
}
保存一下计算结果哦,每次都去重新算,还不算死啊
虽然是long型,但也要注意范围哦
1秒之内就可以算出50以内的fib数了
[解决办法]
对的。而且当递归层数太深会导致栈溢出,程序就挂掉了
[解决办法]
std::map<int,unsigned long> fibMap;
unsigned long fib(long n)
改成unsinged long,1秒之内可以算出200以内的fib数
[解决办法]
浪费时间在find()干什么~
直接用数组~
C/C++ code
#include<iostream>#include <time.h>__int64 map[10000];__int64 fib(__int64 n){    if(map[n] != -1)    {        return map[n];    }    if(n>2)    {        __int64 ret = 1;        ret = fib(n-1)+fib(n-2);        map[n] = ret;        return ret;    }    else    {        map[n] = 1;        return 1;    }}int main(){      clock_t  clockBegin, clockEnd;    clockBegin = clock();   for(int i = 0; i<10000; i++)   {        map[i] = -1;   }   __int64 out = fib(2000);   clockEnd = clock();   std::cout<<out<<" 计算时间"<<clockEnd-clockBegin<<"毫秒"<<std::endl;   getchar();}