【算法】:求Fibonacci的多种思路和算法

来源:互联网 发布:python多线程加锁 编辑:程序博客网 时间:2024/04/30 05:36

求Fibonacci的多种思路和算法

代码

能够直观地看出算法之间效率的区别

 #include <iostream> #include <cstdlib> #include <ctime> using namespace std; /**@brief:Fibonacci数,二分递归版  /* /* @param:n 求第n项Fibonacci数  /* @discription:虽然简洁明了,但是属于2^n的复杂度,这是无法忍受的 。 /* 并且重复递归。  /* @returns: __int64 */ __int64 fib(int n) { // if(n<=0)return n; // else if(n==1)return 1; // else return Fibonacci_A1(n-1)+Fibonacci_A1(n-2);    return (n<2)?(__int64)n:fib(n-1)+fib(n-2); }  /**@brief:Fibonacci数,线性递归版  /* /* @param:n 求第n项Fibonacci数  /* @discription: /*   /* @returns: __int64 */ __int64 fib(int n,__int64 &prev) {    if(n==0)    {        prev=1;return 0;    }    else     {        __int64 prevPrev;          prev=fib(n-1,prevPrev);        return prevPrev+prev;     } } //用辅助变量记录前一项,返回数列的当前项 /**@brief:基于动态规划策略计算Fibonacci数  /* /* @param:n 求第n项  /* @discription:仅仅使用了两个中间变量,通过n次加法和减法计算fib(n)  /* @returns: __int64 */  __int64 fibI(int n)  {    __int64 f=0,g=1;//初始化:fib(0)=0,fib(1)=1     while(n--)    {        g=g+f;f=g-f;        //根据原始定义,通过n次加法和减法计算出fib(n)      }     return f;  }  int main() {    int n=0;     cin>>n;     clock_t st1,st2,st3;     clock_t en1,en2,en3;     cout<<"\n-----Fibonacii数,动态规划版-----\n";     st1=clock();     for(int i=0;i<n;i++)      cout<<"fib("<<i<<")="<<fibI(i)<<endl;      en1=clock();     cout<<"总用时t1="<<(double)(en1-st1)/CLOCKS_PER_SEC<<"s\n";     cout<<"\n-----Fibonacci数,线性递归版-----\n";     st2=clock();     __int64 f;      for(int i=0;i<n;i++)      cout<<"fib("<<i<<")="<<fib(i,f)<<endl;      en2=clock();     cout<<"总用时t2="<<(double)(en2-st2)/CLOCKS_PER_SEC<<"s\n";     cout<<"\n-----Fibonacci数,二分递归版-----\n";     st3=clock();        for(int i=0;i<n;i++)      cout<<"fib("<<i<<")="<<fib(i)<<endl;      en3=clock();     cout<<"总用时t3="<<(double)(en3-st3)/CLOCKS_PER_SEC<<"s\n";    return 0; }

0 0
原创粉丝点击