寫乙個函式,輸入n
,求斐波那契數列中第n
項的數值。
$$ f(n)=\begin 0,\quad n = 0; \\\\ x,\quad n = 1;\\\\ f(n - 1) + f(n - 2),\quad n > 1;\end $$
1. 最基本的方法(運用遞迴)
這個解法是最基本的方法,但是存在很嚴重的效率問題。用樹形結構圖來分析的話,你會發現很多重複的結點。而重複的結點數會隨著n的增大而急劇增加,這就意味著計算量會隨著n的增大而急劇增大,導致時間變得巨長無比。
有興趣的可以嘗試輸入第86項試試,感受一下什麼叫做巨慢無比。
吾來打個樣:
#include /* 最基本的方法 */
long long fibonacci(unsigned int n)
int main(int argc, const char * ar**)
2. 優化後的方法其實改進的方法並不複雜,只需要避免1.最基本方法中的重複計算即可。所以,我們可以把已經得到的數列中間項儲存起來,如果下次需要計算的時候,先查詢一下,如果已經計算過,就不用重複計算了。
當然,更簡單的方法是,自下而上計算,首先根據f(0) 和f(1)算出f(2),再根據f(1)和f(2)算出f(3)……依此類推,可以算出第n項。
那麼,自然的,這種時間複雜度便是o(n)。
吾來打個樣:
#include /* 優化後的方法 */
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;
}int main(int argc, const char * ar**)
3. 青蛙跳台階問題假如有乙隻青蛙,一次可以跳上 1 級台階,也可以跳 2 級台階,請問青蛙上乙個 n 級台階一共有多少種跳法?分析如下:
假如現在台階只有 1 級,n = 1,那麼這只青蛙就在只有 1 種跳法:1(1 代表一次跳 1 級台階)也就是 f(1) = 1 種跳法
假如現在台階只有 2 級,n = 2,那麼這只青蛙可以有 2 種跳法:1 1、2(1 代表一次跳 1 級台階,2 代表一次跳 2 級台階),也就是 f(2) = 2 種跳法
假如現在台階有 3 級,n = 3,青蛙可以有幾種跳法呢?
假如青蛙先跳了 1 級台階,還剩下 2 級台階,那它還有幾種跳法呢?通過第 2 個情況分析知道有 2 種跳法;假如青蛙先跳了 2 級台階,根據第 1 個情況分析知道有 1 種跳法,所以這時候得出 f(3) = 2 + 1 種方法
假如現在台階有 4 級,n = 4,我們利用上面的規律繼續分析可得:f(4) = 3 + 2
綜上所述,我們得出其實這個演算法就是乙個(變形)斐波那契數列問題,公式如下:
所以至此明白了,青蛙跳台階問題就是乙個(變形)斐波那契數列問題。
吾來打個樣:
#include /* 優化後的方法 */
long long fibonacci(unsigned n)
; if(n <= 2)
return result[n];
long long fibnminusone = 2;
long long fibnminustwo = 1;
long long fibn = 0;
for(unsigned int i = 3; i <= n; ++ i)
return fibn;
}int main(int argc, const char * ar**)
青蛙跳台階(斐波那契數列應用)
1 乙隻青蛙一次可以跳上 1 級台階,也可以跳上2 級。求該青蛙跳上乙個n 級的台階總共有多少種跳法。2 乙隻青蛙一次可以跳上1級台階,也可以跳上2 級 它也可以跳上n 級,此時該青蛙跳上乙個n級的台階總共有多少種跳法?問題1 題目描述 乙隻青蛙一次可以跳上1級台階,也可以跳上2級。求該青蛙跳上乙個...
斐波那契數 青蛙跳台階
1 乙隻青蛙一次可以跳上 1 級台階,也可以跳上2 級。求該青蛙跳上乙個n 級的台階總共有多少種跳法。2 乙隻青蛙一次可以跳上1級台階,也可以跳上2 級 它也可以跳上n 級,此時該青蛙跳上乙個n級的台階總共有多少種跳法?分析 1 當n 1,只有1中跳法 當n 2時,有兩種跳法 當n 3 時,有3種跳...
C 實現斐波那契數列 青蛙跳台階
題目 寫乙個函式,輸入n,求斐波那契 fibonacci 數列的前n項。斐波那契數列的定義如下 1 方法1 迴圈的實現方法 include using namespace std int main int main int num 50 int data new int num memset dat...