斐波那契

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

  

posted @ 2013-11-17 20:00  偶尔会寂寞  阅读(231)  评论(0编辑  收藏  举报