題目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)
遞迴方法的優點是**清晰,但存在更嚴重的缺點即計算重複。在《資料結構與演算法分析——c語言描述》的p9頁裡,介紹了遞迴的四條基本法則,其中的第4條就是」合法效益法則「,即在求解乙個問題的同一例項時,切勿在不同的遞迴呼叫中做重複性的工作。此處就違背了這條規則。因此必須尋找別的辦法,避免重複計算問題。
可以從下往上計算,首先根據f(0)和f(1)算出f(2),再根據f(1)和f(2)算出f(3)……依次類推就可以算出第n項了。
long long fibonacci(unsigned n)
; if(n < 2)
return result[n];
long long fibnminusone = 1;
long long fibnminustwo = 0;
long long fibn = 0;
for(unsigned int i = 2; i <= n; ++i)
return fibn;
}
該方法的時間複雜度為o(n)。
題目2描述:
乙隻青蛙一次可以跳上1級台階,也可以跳上2級。求該青蛙跳上乙個n級的台階總共有多少種跳法。
分析描述:
把n級台階的跳法看成是n的函式,記為f(n)。當n>2時,第一次跳的時候就有兩種不同的選擇:一是第一次只跳1級,此時跳法數目等於後面剩下的n-1級台階的跳法數目,即為f(n-1);另外一種選擇是第一次跳2級,此時跳法數目等於後面剩下的n-2級台階的跳法數目,即為f(n-2)。因此n級台階的不同跳法的總數f(n) = f(n-1) + f(n-2)。
劍指offer 斐波那契數列
記錄來自 劍指offer 的演算法題。題目如下 寫乙個函式,輸入n,實現斐波那契數列的第n項。斐波那契數列的定義如下 f n 01 f n 1 f n 2 n 0 n 1n 1 教科書上通常在介紹遞迴的時候都會使用斐波那契數列作為例子,然後給出下列解法 long long fibonacci uns...
劍指offer 斐波那契數列
現在要求輸入乙個整數n,請你輸出斐波那契 fibonacci 數列的第n項。此題易用遞迴來實現 public intfibonacci int n 但是上述的遞迴解法有很嚴重的效率問題。以求解 f 10 為例,想求得 f 10 需要先求得 f 9 和 f 8 同樣,想求得 f 9 需要先求得 f 8...
劍指offer 斐波那契數列
思路 斐波那契數列屬於非常經典的遞迴問題,但也可以用迴圈做。author tom qian email tomqianmaple outlook.com github date 2017年8月10日 大家都知道斐波那契數列,現在要求輸入乙個整數n,請你輸出斐波那契數列的第n項。n 39 public...