演算法導論學習之補漏:斐波那契數列

趙明威發表於2016-06-05

斐波那契數列(Fibonacci sequence),又稱黃金分割數列、因數學家列昂納多·斐波那契(Leonardoda Fibonacci1 )以兔子繁殖為例子而引入,故又稱為“兔子數列”,指的是這樣一個數列:0、1、1、2、3、5、8、13、21、34、……在數學上,斐波納契數列以如下被以遞迴的方法定義:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2,n∈N*)在現代物理、準晶體結構、化學等領域,斐波納契數列都有直接的應用,為此,美國數學會從1963起出版了以《斐波納契數列季刊》為名的一份數學雜誌,用於專門刊載這方面的研究成果。

對於一般的程式來說比如C語言返回第99項 斐波那契數列 :unsigned long int feibo(int num);

的結果為-2437933049959450366,其實早已超出了 unsigned long int 範圍.

收到黃志斌 的評論建議,下面用Java 的BigDecimal 和 BigInteger 資料型別來分別實現,並且測試效能,發現BigInteger的實現速度比較快.還是要不斷的學習和探索啊,稍等會在合集 Java基礎學習心得加上這兩種型別的學習

BigDecimal版本BigInteger版本
    package com.xiaoming.test;
    import java.math.BigDecimal;
    public class BigDec {
    public static BigDecimal 
           fibonacci(int num){
    BigDecimal x = new BigDecimal(0);
    BigDecimal y = new BigDecimal(1);
        for(int i = 0; i &lt num; i ++){
            y = x.add(y);
            x = y.subtract(x);
        }
        return x;
    }
    }
  
   package com.xiaoming.test;
   import java.math.BigInteger;
    public class BigInt {
    public static BigInteger
             fibonacci(int num){
    BigInteger x = BigInteger.ZERO;
    BigInteger y = BigInteger.ONE;
        for(int i = 0; i &lt num; i ++){
            y = x.add(y);
            x = y.subtract(x);
        }
        return x;
    }

    }
同樣的測試程式碼
public static void main(String[] args) {
        Long time1 = System.nanoTime();
        fibonacci(100);
        Long time2 = System.nanoTime();

        System.out.printf("cost time :%d ns\n",time2 - time1);
        System.out.println(fibonacci(100));//354224848179261915075
    }
結果:
    cost time :6990062 ns
    354224848179261915075
結果:
    cost time :1403513 ns
    354224848179261915075

根據評論進行改進:結果耗時 減少到了6位數,同時請大家參考註釋部分// BigInteger z;儘量減小作用域的問題變數的作用域最小化原則

package com.xiaoming.test;

import java.math.BigInteger;


public class BigInt {

public static void main(String[] args) {
    Long time1 = System.nanoTime();
    fibonacci(100);
    Long time2 = System.nanoTime();

    System.out.printf("cost time :%d ns\n",time2 - time1);
    System.out.println(fibonacci(100));//354224848179261915075
}


public static BigInteger fibonacci(int num){
    BigInteger x = BigInteger.ZERO;
    BigInteger y = BigInteger.ONE;
    // BigInteger z;
    for(int i = 0; i < num; i ++){
       BigInteger z = y;
        y = x.add(y);
        x = z;
    }
    return x;
}
}

結果:

cost time :900101 ns
354224848179261915075

最近申請了微信公眾號,希望大家來看看,專門為程式設計師而生,做最好的程式設計

高斯

相關文章