fibonacci数列C++语言多种实现

10 篇文章 0 订阅

转载时请注明出处和作者联系方式
文章出处:
http://blog.csdn.net/chenchong08
作者联系方式:vision_chen@yeah.net

斐波纳契数列(Fibonacci Sequence),又称黄金分割数列,指的是这样一个数列:

    1、1、2、3、5、8、13、21、... ...

在数学上,斐波纳契数列以如下被以递归的方法定义:f(0)=1, f(1)=1, f(n)=f(n-1)+f(n-2)(n>=2,n∈N*).

  1. <span style="font-size:16px;">#include <cstdio>  
  2. #include <cstdlib>  
  3. #include <vector>  
  4. #include <queue>  
  5. #include <cmath>  
  6.   
  7. using namespace std;  
  8.   
  9. /* 
  10. * fibonacci的递归函数解法 
  11. * 优点:代码简单,易于理解 
  12. * 缺点:fib参数参数比较大时,运算量很大 
  13. */  
  14. unsigned long long Fib_Recursive( unsigned int fib )  
  15. {  
  16.     if ( fib > 2 ) return ( Fib_Recursive(fib-1) + Fib_Recursive(fib-2) );  
  17.     else if ( 2 == fib ) return 2;  
  18.     else if ( 1 == fib ) return 1;  
  19.     return 1;  
  20. }  
  21.   
  22. /* 
  23. * fibonacci的数组解法 
  24. * 优点:代码比较简单,也比较容易理解 
  25. * 缺点:fib多大就new多大的内存 
  26. */  
  27. unsigned long long Fib_Array( unsigned int fib )  
  28. {  
  29.     unsigned long long result = 1;  
  30.     if ( fib > 2 )  
  31.     {  
  32.         unsigned long long *pArray = NULL;  
  33.         pArray = new unsigned long long[fib];  
  34.         pArray[0] = 1;  
  35.         pArray[1] = 2;  
  36.         unsigned int loop;  
  37.         for ( loop = 2 ; loop < fib; ++loop  )  
  38.         {  
  39.             pArray[loop] = pArray[loop-1] + pArray[loop-2];  
  40.         }  
  41.         result = pArray[loop-1];  
  42.         delete []pArray;  
  43.     }  
  44.     else if ( 2 == fib ) return 2;  
  45.     else if ( 1 == fib ) return 1;  
  46.     return result;  
  47. }  
  48.   
  49. /* 
  50. * vector实现 
  51. */  
  52. unsigned long long Fib_Vector( unsigned int fib )  
  53. {  
  54.     if ( fib > 2 )  
  55.     {  
  56.         vector<unsigned long long> resultVec;  
  57.         resultVec.reserve( fib );  
  58.         resultVec.push_back(1);  
  59.         resultVec.push_back(2);  
  60.         unsigned int i;  
  61.         for ( i = 2; i < fib; ++i )  
  62.         {  
  63.             resultVec.push_back( resultVec[i-1]+resultVec[i-2] );  
  64.         }  
  65.         return resultVec[i-1];  
  66.     }  
  67.     else if ( 2 == fib ) return 2;  
  68.     else if ( 1 == fib ) return 1;  
  69.     return 1;  
  70. }  
  71.   
  72. /* 
  73. * queue实现 
  74. */  
  75. unsigned long long Fib_Queue( unsigned int fib )  
  76. {  
  77.     if ( fib > 2 )  
  78.     {  
  79.         queue<unsigned long long> resultQueue;  
  80.         resultQueue.push(1);  
  81.         resultQueue.push(2);  
  82.         for (unsigned int i = 2; i < fib; ++i )  
  83.         {  
  84.             resultQueue.push(resultQueue.front() + resultQueue.back());  
  85.             resultQueue.pop();  
  86.         }  
  87.         return resultQueue.back();  
  88.     }  
  89.     else if ( 2 == fib ) return 2;  
  90.     else if ( 1 == fib ) return 1;  
  91.     return 1;  
  92. }  
  93.   
  94. /* 
  95. * 迭代实现 
  96. */  
  97. unsigned long long Fib_Iteration( unsigned int fib )  
  98. {  
  99.     if ( fib > 2 )  
  100.     {  
  101.         unsigned long long a1 = 1, a2 = 2, a3 = 0;  
  102.         unsigned int i;  
  103.         for (i=0; i<fib-2; ++i)  
  104.         {  
  105.             a3 = a1 + a2;  
  106.             a1 = a2;  
  107.             a2 = a3;  
  108.         }  
  109.         return a3;  
  110.     }  
  111.     else if ( 2 == fib ) return 2;  
  112.     else if ( 1 == fib ) return 1;  
  113.     return 1;  
  114. }  
  115.   
  116. /* 
  117. * 公式实现  
  118. * 缺点:有误差  
  119. */  
  120. unsigned long long Fib_Formula( unsigned int fib )  
  121. {  
  122.     if ( fib > 0 )  
  123.     {  
  124.         double square_root_5=sqrt((double)5);             
  125.         return (pow((1+square_root_5),(double)(fib+1))-pow((1-square_root_5),(double)(fib+1)))/(pow((double)2,(double)(fib+1))*square_root_5);  
  126.     }  
  127.     return 1;  
  128. }  
  129.   
  130. int main(int argc, char **argv)  
  131. {  
  132.     unsigned int i;  
  133.     for ( i = 0; i <= 20; ++i )  
  134.     {  
  135.         printf(" %lld\t%lld\t%lld\t%lld\t%lld\t%lld\n",Fib_Recursive(i),Fib_Array(i),Fib_Vector(i),Fib_Queue(i),Fib_Iteration(i),Fib_Formula(i));  
  136.     }  
  137.   
  138. #ifdef _WIN32  
  139.     system("pause");  
  140. #endif  
  141.     return 0;  
  142. }</span>  


VS2012运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值