很多时候递归是很直观的解决问题的方式,但往往递归的分支较多或层数较深的时候会导致程序运行超时或递归栈爆炸。
以HDUOJ 2041题为例,实际上该题就是fibnacci数列求解,但如果我们写成
int fib(int n) {
if(n==0) return 1;
if(n==1) return 1;
else return fib(n-1)+fib(n-2);
}
画出递归树,当n=40的时候,需要计算次数是大约是1+2^1+2^2+...+2^39=2^40-1(实际是((1+sqrt(5))/2)^n),约等于10^12,明显会超时。
这个时候就需要用递推来解决了,2041的代码如下
#include <iostream>
#include <iomanip>
#include <cmath>
#define PI 3.1415927
using namespace std;
//采用递推,如果使用递归会超时
int func(int n) {
int a[40]={0};
a[0]=1;
a[1]=1;
for(int i=2; i<n; i++) {
a[i]=a[i-1]+a[i-2];
}
return a[n-1];
}
int main()
{
int n;
cin >> n;
for(int i=0; i<n; i++) {
int m;
cin >> m;
cout << func(m) << endl;
}
return 0;
}
目前求fibnacci数列最快可以利用分治思想做到O(lgn)