zoukankan      html  css  js  c++  java
  • 编程之美之斐波那契数列

    【背景】

    【思路1-递归】

    [cpp] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. int Fibonacci(int n){  
    2.         if(n <= 2){  
    3.             return n;  
    4.         }  
    5.         return Fibonacci(n - 1) + Fibonacci(n - 2);  
    6.     }  


    进一步优化:

    当n增大到一定数值,Fibonacci数列值会溢出,并且花费时间很长。

    [cpp] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. long long Fibonacci(int n){  
    2.         if(n <= 2){  
    3.             return n;  
    4.         }  
    5.         return Fibonacci(n - 1) + Fibonacci(n - 2);  
    6.     }  


    【思路2-递推关系式的优化】

    [cpp] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. long long Fibonacci(int n){  
    2.         long long* Fibonacci = (long long*)malloc(sizeof(long long)*(n+1));  
    3.         Fibonacci[0] = 0;  
    4.         Fibonacci[1] = 1;  
    5.         for(int i = 2;i <= n;i++){  
    6.             Fibonacci[i] = Fibonacci[i-1] + Fibonacci[i-2];  
    7.         }  
    8.         return Fibonacci[n];  
    9.     }  


    该思路的另一种实现方法:

    [cpp] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. long long  Fibonacci(int n){  
    2.         int i;  
    3.         long long fibonacciA = 0;  
    4.         long long fibonacciB = 1;  
    5.         long long fibonacciC;  
    6.         if(n == 0){  
    7.             return 0;  
    8.         }  
    9.         else if(n == 1){  
    10.             return 1;  
    11.         }  
    12.         for(i = 2;i <= n;i++){  
    13.             fibonacciC = fibonacciA + fibonacciB;  
    14.             fibonacciA = fibonacciB;  
    15.             fibonacciB = fibonacciC;  
    16.         }  
    17.         return fibonacciC;  
    18.     }  

    【思路3-求解通项公式】

    [cpp] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. int Fibonacci(int n) {  
    2.         double s = sqrt(5);  
    3.         // floor 返回小于或者等于指定表达式的最大整数  
    4.         return floor((pow((1+s)/2, n) - pow((1-s)/2, n))/s + 0.5);  
    5.     }  


    当n增大到一定数值,Fibonacci数列值会溢出。因为floor返回小于或者等于指定表达式的最大整数

    【思路4-分支策略】

    [cpp] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. #include <iostream>  
    2. #include <malloc.h>  
    3. #include <stdio.h>  
    4. using namespace std;  
    5. //矩阵乘法  
    6. void MatrixMulti(long long matrix[2][2],long long matrix2[2][2]){  
    7.     long long a = matrix[0][0] * matrix2[0][0] +  matrix[0][1] * matrix2[1][0];  
    8.     long long b = matrix[0][0] * matrix2[0][1] +  matrix[0][1] * matrix2[1][1];  
    9.     long long c = matrix[1][0] * matrix2[0][0] +  matrix[1][1] * matrix2[1][0];  
    10.     long long d = matrix[1][0] * matrix2[0][1] +  matrix[1][1] * matrix2[1][1];  
    11.     matrix[0][0] = a;  
    12.     matrix[0][1] = b;  
    13.     matrix[1][0] = c;  
    14.     matrix[1][1] = d;  
    15. }  
    16. //Fibonacci数列  
    17. long long Fibonacci(int value){  
    18.     if(value == 0){  
    19.         return 0;  
    20.     }  
    21.     long long A[2][2] = {1,1,1,0};  
    22.     //初试为单位矩阵  
    23.     long long Matrix[2][2] = {1,0,1,0};  
    24.     int n = value - 1;  
    25.     for(; n ;n >>= 1){  
    26.         //奇偶  
    27.         if(n&1){  
    28.             MatrixMulti(Matrix,A);  
    29.         }//if  
    30.         MatrixMulti(A,A);  
    31.     }//for  
    32.     return Matrix[0][0];  
    33. }  
    34.   
    35. int main() {  
    36.     int i,n,height;  
    37.     while(scanf("%d",&n) != EOF){  
    38.         long long result;  
    39.         for(i = 0;i <= n;i++){  
    40.             result = Fibonacci(i);  
    41.             printf("%lld ",result);  
    42.         }//for  
    43.     }//while  
    44.     return 0;  
    45. }  

    该思路另一种解析:

  • 相关阅读:
    Gartner:安全软件在经济危机中独善其身 狼人:
    美军正式成立网络战司令部 保护美军网络 狼人:
    警惕“搜房网”“凯业房园”等网站被挂马 狼人:
    Gartner:08年全球杀毒软件市场份额排名 微软第七 狼人:
    专访梭子鱼:以“立体交付”保障Web应用安全 狼人:
    安全专家称Opera Unite或成黑客“好友” 狼人:
    微软正式提供免费杀毒软件下载 仅限7.5万份 狼人:
    电信故障引发全国多地上网难 京沪等地受影响 狼人:
    中国拟修订保守国家秘密法 严防通过互联网泄密 狼人:
    Google推反恶意广告网站 防护恶意软件威胁 狼人:
  • 原文地址:https://www.cnblogs.com/ghostll/p/3532767.html
Copyright © 2011-2022 走看看