求Fibonacci数列的三种思路和算法(C++实现)

版权声明:本文为 @iCurious
的原创文章,可以转载,但请务必注明作者和出处,谢谢合作!!!

摘要

本文主要介绍求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;
 }

运行结果

运行效果

版权声明:本文为 @iCurious
的原创文章,可以转载,但请务必注明作者和出处,谢谢合作!!!

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值