通常求n的斐波那契数,我们就是简单的使用如下的递归函数:
int fib1(int n) { if(n<=1) return n; return fib1(n-1)+fib1(n-2); }
其实,这种递归所能求的n的范围很有限,空间和时间上都是以指数级在增长,假如n仅仅等于40,所要花费的时间也已经很长了。
从递归树中我们可以看出,其实只要有一个数组能够记录下每次得到的结果,那么就能节省空间和时间,这种思想是出于记忆搜索或者动态规划的想法。
int memo[MAX+1]; int fib2(int n) { if(n<=1) return n; if(memo[n]!=0) return memo[n]; return memo[n] = fib2(n-1)+fib2(n-2); }
源代码:
#include<iostream> #include<cstring> #define MAX 200 using namespace std; int fib1(int n) { if(n<=1) return n; return fib1(n-1)+fib1(n-2); } int memo[MAX+1]; int fib2(int n) { if(n<=1) return n; if(memo[n]!=0) return memo[n]; return memo[n] = fib2(n-1)+fib2(n-2); } int main() { memset(memo, 0 ,sizeof(memo)); // int n1 = fib1(40); // cout<<n1<<endl; int n2 = fib2(40); cout<<n2<<endl; return 0; }