演算法導論學習之補漏:斐波那契數列
斐波那契數列(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 < 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 < 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
最近申請了微信公眾號,希望大家來看看,專門為程式設計師而生,做最好的程式設計
相關文章
- 斐波那契數列
- 斐波那契數列演算法演算法
- 演算法(1)斐波那契數列演算法
- 斐波那契數列(Java)Java
- 演算法一:斐波那契阿數列演算法
- 大數斐波那契數列的演算法演算法
- 斐波那契數列 (C#)C#
- PHP 與斐波那契數列PHP
- 斐波那契數列詳解
- 斐波那契數
- 計算斐波那契數列的演算法演算法
- 斐波那契數列演算法 JS 實現演算法JS
- js實現斐波那契數列JS
- 斐波那契數列js 實現JS
- 斐波那契數列Ⅳ【矩陣乘法】矩陣
- 博弈論入門之斐波那契博弈
- 面試題9-斐波那契數列面試題
- [C103] 斐波那契數列
- 博弈學習 (二) 斐波那契博弈
- “斐波那契數列”問題的遞推演算法演算法
- 使用Python實現斐波那契數列Python
- JavaScript 實現:輸出斐波那契數列JavaScript
- js迭代器實現斐波那契數列JS
- 斐波那契數列的分治法計算
- 斐波那契數列的python實現Python
- 資料結構之斐波那契數列java實現資料結構Java
- 【演算法詳解】斐波那契數列 - Fibonacci sequence演算法
- Leedcode-斐波那契數
- 演算法 - 斐波那契 - javascript 版演算法JavaScript
- 斐波那契數列三種實現函式函式
- 劍指offer-9-斐波那契數列-javaJava
- hdu 3117矩陣+斐波那契數列矩陣
- 演算法學習記錄六(C++)--->獲取斐波那契數列第n項演算法C++
- 【演算法】Fibonacci(斐波那契數列)相關問題演算法
- 斐波那契查詢
- 斐波那契數列的通項公式及證明公式
- 每日一算 -- 斐波那契數列型別題型別
- 斐波那契數列 多語言實現 筆記筆記