題目一:寫乙個函式,輸入n,求斐波那契(fibonacci)數列的第n項。
解析:一直以來很多c語言教科書在講遞迴函式的時候總會拿斐波那契數列作為例子。但是這不意味這fibonacci的最合適的解法就是用遞迴來實現。如果面試問道這題然後用遞迴解,那基本就gg了。因為遞迴呼叫過程中有很多重複計算,而且重複的數量隨著n的增加而劇增,實際上斐波那契遞迴時間複雜度是以n的指數級的方式遞增,計算f(100)估計等到花兒都謝了。
其實觀察數列就不難發現,只要有前兩項就能算出下一項,如f(0), f(1)計算出f(2), f(1), f(2)計算出f(3)以此類推,這樣就能用迴圈計算出第n項的值。時間複雜度o(n).
**:
#include using namespace std;
//非遞迴求斐波那契第n項o(n)
long long fib(unsigned n)
return fn;
}//遞迴斐波那契第n項,指數級
long long fibres(unsigned n)
int main()
解析:這個問題乍一看很難,無從下手。這種時候首先考慮簡單情況。設 f(n) 為n級台階的跳法數,當 n=1 時,顯然只有一種跳法 f(1) = 1; 當 n = 2 的時候,有兩種跳法分別是跳兩次1級,或者一次跳兩級台階,即 f(2) = 2;
再來考慮一般情況。n > 2 ,當青蛙剛開始跳的時候,它有兩種跳法級跳一級或者跳兩級,那麼
f(n) = 第一步跳一級的跳法 + 第一步跳二級的跳法 = 剩下n-1階台階的跳法 + 剩下n-2階台階的跳法
即 f(n) = f(n-1) + f(n-2),
那麼現在情況已經很明朗了,這就是乙個斐波那契數列的應用 ,寫出斐波那契函式計算出第n項即可。
遇到複雜問題無從下手,先由簡單情況考慮入手。
劍指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 項。...