大家都知道斐波那契數列,現在要求輸入乙個整數n,請你輸出斐波那契數列的第n項(從0開始,第0項為0,第1項是1)。n<=39
斐波那契數列由 0 和 1 開始,之後的斐波那契數就是由之前的兩數相加而得出。f(0) = 0, f(1) = 1 f(n) = f(n - 1) + f(n - 2), 其中 n > 1.
解法一:
最直接想到的就是遞迴。也就是從n到0考慮通過f(n) = f(n - 1) + f(n - 2)
得出結果。然而遞迴要呼叫自身,函式呼叫需要時間空間還有很多重複計算,對效能有負面影響。
class
solution
return
fibonacci
(n -1)
+fibonacci
(n -2)
;}return-1
;}};
解法二:
反向考慮,從0到n,把左腳想象成i-2項,右腳是i-1項。每次迴圈右腳加左腳的結果都更新在右腳上,再把左腳踩到原本的右腳位置, 想象成左腳右腳不超越式前進。
class
solution
// f(n-2)
int a =0;
// f(n-1)
int b =1;
while
(n >1)
return b;
}return-1
;}};
和解法二類似,迴圈計數為奇數則不動右腳,把右腳加左腳的和更新在左腳,而超越右腳。為偶數時,把右腳加左腳的結果更新在右腳, 想象成正常走路,左腳右腳超越式前進。
tips: 奇偶數判斷除了% 2還可以用按位與& 1,但值得注意的是&的優先順序小於==,所以判斷偶數時 if ((n&1)==0) 一定要帶上括號
class
solution
// f(n-2)
int a =0;
// f(n-1)
int b =1;
int i =2;
while
(i <= n)
else
i++;}
if(!(n&1)
)else
}return-1
;}};
劍指offer刷題 斐波那契數列
題目一 寫乙個函式,輸入n,求斐波那契數列的第n項。對於題目一,接觸過遞迴人可能首先想到的就是通過遞迴的方法解決問題,例如計算第10項的斐波那契數列首先來看一下遞迴解決問題的思路,主要如下圖所示 我們可以發現,採用這種方式,做了很多的重複工作,例如f 8 就計算了兩次,第n是乙個非常大的數時,這耗費...
劍指offer 斐波那契數列
題目1描述 寫乙個函式,輸入n,求斐波那契數列的第n項。斐波那契數列的定義如下 f n 0 n 0 f n 1 n 1 f n f n 1 f n 2 n 1 分析描述 在大多數的c語言教科書中,一般會用遞迴求斐波那契數列。如下 long long fibonacci unsigned int n ...
劍指offer 斐波那契數列
記錄來自 劍指offer 的演算法題。題目如下 寫乙個函式,輸入n,實現斐波那契數列的第n項。斐波那契數列的定義如下 f n 01 f n 1 f n 2 n 0 n 1n 1 教科書上通常在介紹遞迴的時候都會使用斐波那契數列作為例子,然後給出下列解法 long long fibonacci uns...