實現斐波那契數列的三種方式

2021-09-09 02:02:11 字數 1567 閱讀 6073

首先說說斐波那契數列:

從文字上說,斐波那契數列由0和1開始,之後的斐波那契係數就由之前的兩數相加,數列形式如下:

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584,………………

在數學上,是以遞迴的方法來定義:

f(0)=0

f(1)=1

f(n)= f(n-1)+ f(n-2)

實現需求:輸入序號n返回得到對應斐波那契數

程式實現1——函式迭代

public

int fntype1(int n)throws

exception

else

if(n==1||n==2)

else

if(n>2)

else

}else

}

此種方式缺點:大量迭代不斷消耗棧空間(搞web開發除錯維護的都應該知道伺服器棧資源的可貴,如果大量併發呼叫迭代導致伺服器棧資源遲遲得不到**,而導致web伺服器崩潰),效率底,函式自閉性比較弱(優秀的介面應該對輸入輸出可能出現的錯誤資訊進行捕捉,並提供清楚明了的處理結果),很容易出現錯誤,除錯困難,實際應用中一般不建議使用這種方式,使用時迭代次數也不能超過3次;

程式實現2——時間換空間

public

int fntype2(int

n)

else

if (index == 1)

else

temp1 =temp2;

temp2 =result;}}

return

result;

}

此方法主要使用於:使用場景一:對於物件或變數使用次數比較少,使用一次以後就不會再使用的場景;使用場景二:對於記憶體資源比較稀缺的實時性要求不是太高的嵌入式系統設計中多會採用此種方式;

程式實現3——空間換取時間

private

static listfndata = new arraylist();

private

static

final

int maxsize = 50000;

private

static

void

setfndata()

else

if (index == 1)

else

temp1 =temp2;

temp2 =result;

}fndata.add(result);}}

public

int getfndata(int

n)

if (fndata.size() > n && n >= 0)

else

}

此方法一般用於:物件或變數在程式執行的整個生命週期都存在或頻繁呼叫的場景,如呼叫外部webservice介面、抽象持續化層、常用配置檔案引數載入等等

對於演算法設計,不要盲目遵循概念,概念是死的,人是活的,只用結合具體的應用場景才能設計出優秀的演算法和結構。

斐波那契數列的三種實現方法

斐波那契數列是學習演算法碰到的,以自己當前的知識面還不足以想到通過公升高乙個維度來降低演算法的時間複雜度.昨天再看劍指offer的時候,在面試題9中提到了三種實現計算斐波那契數列的方法.在這裡實現三種做法貌似還有乙個o 1 的計算方法,也就是斐波那契數列是可以直接推到出來的.1.常規的遞迴演算法 d...

斐波那契數列的三種解法

寫乙個函式,輸入n,求斐波那契數列的第n項。斐波那契數列的定義如下 課本的上為了講解遞迴演算法,經常用這個例子。讓我們看一下它的實現 package algorithm public class fibonacci recursion public static void main string a...

斐波那契數列的三種寫法

斐波那契數列,又稱 分割數列,指的是這樣乙個數列 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 在現代物理 準晶體結構 化學等領域,斐波納契數列都有直接的應用,為此,美國數學會從1...