通常求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;
}