为啥我的电脑计算下列程序很慢?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();} 