求斐波那契數列的第n項

2022-09-08 17:48:10 字數 1593 閱讀 3252

問題描述:斐波那契數列是這樣的乙個數列,1,1,2,3,5,8,..,即前兩項都是1,後面每一項都是其前面兩項的和。

現在要你求出該數列的第n項。

解法一:遞迴演算法。很多教科書上都用這個題作為函式遞迴知識點講解的例題,我們可以將每乙個項的求法表達為這樣乙個式子:

f(n)=f(n-1)+f(n-2),f(1)=1,f(2)=1,可以看出,可以採用遞迴演算法求解。

解法二:迴圈求法。我們可以從第1項開始,一直求到第n項,即可,乙個迴圈可以做到,時間複雜度為o(n).

解法三:矩陣鏈乘法。如果線性代數學的好的話,可以想出這樣一種解法,

同樣可以採用遞迴的演算法求解,時間複雜度為o(logn).

三種解法對比:解法一程式設計最簡單,但是效率最低,因為這種遞迴演算法求解時,會重複求解子問題。如下圖示:

這樣就看出來吧!另外如果n很大的話,遞迴的層數很大,會消耗系統大量的時間和資源。

解法二避免了重複求解子問題,線性時間即可求出,值得採用。

解法三效率最高,但是程式設計特別複雜,在有些情況下,很合適使用,但就本題目來說,推薦解法二。

針對上述三種解法,我給出了詳細的j**a**,讀者可以參考:

1

import j**a.util.*;

2public

class

main

7public

static

int f2(int n)

16return

a2;17}18

public

static

int f3(int n),}; //

定義基矩陣

20int b; //

儲存子方法的結果

21int c=new

int[2][2]; //

儲存最後計算結果

22int d=new

int[2][2]; //

儲存中間計算結果

23if((n)<=1)return a; //

如果次方小等於1直接返回

24else

if((n) %2==1)

25

38else

46return

c;47}48

public

static

void

main(string args) ,}的n-1次方

55 system.out.println("方法三:"+a[0][0]);

5657}58

59 }

輸出結果為:

10方法一:55

方法二:55

方法三:55

求斐波那契數列的第n項

斐波那契數列的定義如下 f 0 0 f 1 1 f n f n 1 f n 2 n 2 1,1,2,3,5,8,13,21,34,55,89,144,233,377,給出n,求f n 由於結果很大,輸出f n 1000000009的結果即可。input 輸入1個數n 1 n 10 18 output...

斐波那契數列第n項

1 斐波那契數列第n項 在斐波那契數列中,fib0 0,fib1 1,fibn fibn 1 fibn 2 n 1 給定整數n,求fibn mod10000。輸入格式 輸入包含多組測試用例。每個測試用例佔一行,包含乙個整數n。當輸入用例n 1時,表示輸入終止,且該用例無需處理。輸出格式 每個測試用例...

求斐波那契數列第n項的值

斐波那契數列的描述 斐波那契數列的描述 斐波那契數列,又稱 分割數列,指的是這樣的乙個數列 0 1 1 2 3 5 8 13 21 在數學上,斐波那契數列定義如下 f 0 0,f 1 1,f n f n 1 f n 2 n 2,n n 即這個數列從第二項開始,每一項都等於前兩項之和。特別指出 0是第...