劍指offer 面試題10(1) 斐波那契數列

2021-10-02 09:10:40 字數 1360 閱讀 4488

大家都知道斐波那契數列,現在要求輸入乙個整數n,請你輸出斐波那契數列的第n項(從0開始,第0項為0)。

接觸過程式語言的,在學遞迴的時候應該都是第乙個就學斐波那契數列吧哈哈,就像程式設計師的第一句話永遠是hello world!

來自官方的斐波那契數列定義複製用一下:

斐波那契數列以如下被以遞推的方法定義,

f(1)=1,f(2)=1, f(n)=f(n - 1)+f(n - 2)(n ≥ 3,n ∈ n*).

(1)遞迴方法的思路 – 時間複雜度高,效率低

斐波那契數列的特點,就是遞迴程式的邊界

個人觀點寫遞迴程式的第一步是確定退出遞迴的邊界條件。

那根據斐波那契數列的定義,程式的邊界應該有兩個:

①明面上的n = 1 或 n = 2時,f(n) = 1;

②另乙個是n <= 0 的時候,f(n) = 0,我們傳參的時候並不能保證引數都是符合定義要求的,所以需要人為設定返回值為0,來保證**的健壯性。

(2)時間複雜度低的思路

第一種思路之所以效率低,是因為重複計算太多,所以避免重複計算就可以降低時間複雜度。建立並初始化兩個變數fibonaccifirst = f(0)和fibonaccisecond = f(1),在求解過程中不斷更新fibonaccifirst和fibonaccisecond,即依次把已經得到的兩個數列中間項儲存起來,這樣就可以根據定義,對斐波那契數列遞推地進行求解了,而且不會產生重複計算。時間複雜度------o(n)。

思路(1)**

public

class

solution

else

if(n ==

2|| n ==1)

else

}}

當然這麼寫好像不怎麼優雅

下面更優雅的**

public

class

solution

}

but!思路(2)的**寫起來那可是更優雅

// 建議**使用long定義所有整數,根據實際情況調整吧。

public

class

solution

if(n ==1)

for(

int i =

2; i <= n; i++)}

}

拜個晚年!祝大家平平安安度過春節,一切順心!

劍指offer面試題 斐波那契數列

斐波那契數列 fibonacci sequence 又稱 分割數列 因數學家列昂納多 斐波那契 leonardoda fibonacci 以兔子繁殖為例子而引入,故又稱為 兔子數列 指的是這樣乙個數列 1 1 2 3 5 8 13 21 34 在數學上,斐波納契數列以如下被以遞迴的方法定義 f 1 ...

劍指Offer 面試題9 斐波那契數列

題目 寫乙個函式,輸入n,求斐波那契數列的第n項 解法一 剛進大一的時候,學習c語言,斐波那契數列是經常用於展示遞迴的經典例子.但是從時間複雜度角度來說的話,採用尾遞迴這並不是乙個優秀的演算法.public void fibonacci int n if n 1 return finonacci n...

劍指offer 面試題 9 斐波那契數列

題目 寫乙個函式,輸入 n,求斐波那契數列的第 n 項。斐波那契數列是乙個很出名的數列,它的特點是從第三項開始,每項都等於前兩項之和。對於它的實現有多重方法,有優有劣,直接看 吧 package swordoffer 面試題 9 斐波那契數列 題目 寫乙個函式,輸入 n,求斐波那契數列的第 n 項。...