關於斐波那契數列在百度百科上的定義如下:
斐波那契數列,又稱黃金分割數列,指的是這樣一個數列: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*)百度百科關於斐波那契數列的來源請參見兔子問題根據其定義我們可以很方便的構建出該數列的數據結構實現。
實現一:基於遞歸形式實現
/**
* 返回斐波那契數第n個值,n從0開始
* 實現方式,基於遞歸實現
* @param n
* @return
* @author [email protected]
* @since 2015年8月18日上午9:41:30
*/
public static int getFib(int n){
if(n < 0){
return -1;
}else if(n == 0){
return 0;
}else if(n == 1 || n ==2){
return 1;
}else{
return getFib(n - 1) + getFib(n - 2);
}
}
遞歸是最簡單的實現方式,但遞歸有很多的問題,在n的值非常大時,會佔用很多的內存空間,既然該數列定義F(n)=F(n-1)+F(n-2)(n≥2,n∈N*),那麼我們可以從頭到尾進行計算,先計算前面的值,然後逐步算出第n個值。
方式二:基於變量形式實現
/**
* 返回斐波那契數第n個值,n從0開始
* 實現方式,基於變量實現
* @param n
* @return
* @author [email protected]
* @since 2015年8月18日上午9:32:26
*/
public static int getFib2(int n){
if(n < 0){
return -1;
}else if(n == 0){
return 0;
}else if (n == 1 || n == 2){
return 1;
}else{
int c = 0, a = 1, b = 1;
for(int i = 3; i <= n; i++){
c = a + b;
a = b;
b = c;
}
return c;
}
}
從上面的實現中我們定義了3個變量a、b、c其中c=a+b,然後逐步進行計算從而得到下標爲n的值。
既然我們可以定義變量進行存儲,那麼同樣我們還可以定義一個數組,該數組的每一個元素即一個斐波那契數列的值,這樣我們不僅能得到第n個值,還能獲取整個斐波那契數列。
方式三:基於數組的實現
/**
* 返回斐波那契數第n個值,n從0開始
* 實現方式,基於數組實現
* @param n
* @return
* @author [email protected]
* @since 2015年8月18日上午9:22:15
*/
public static int getFib3(int n){
if(n < 0){
return -1;
}else if(n == 0){
return 0;
}else if (n == 1 || n == 2){
return 1;
}else{
int[] fibAry = new int[n + 1];
fibAry[0] = 0;
fibAry[1] = fibAry[2] = 1;
for(int i = 3; i <= n; i++){
fibAry[i] = fibAry[i - 1] + fibAry[i - 2];
}
return fibAry[n];
}
}
到此3種Java實現斐波那契數列完成,如果大家有其他更好的實現方式歡迎指出