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. }  

    该思路另一种解析:

  • 相关阅读:
    算法(一)—— 河内之塔(汉诺塔)
    JAVA爬取网页邮箱
    js中判断某字符串含有某字符出现的次数
    逻辑删除和物理删除的区别
    Forward和Redirect的区别
    Postman 传Map类型的参数
    Java基础
    【html-css】
    【HTML----】
    【python-while-以及字符串的相关操作和函数】
  • 原文地址:https://www.cnblogs.com/ghostll/p/3532767.html
Copyright © 2011-2022 走看看