演算法小記 斐波那契數列 青蛙跳台階問題

2021-09-19 22:19:16 字數 2075 閱讀 9794

寫乙個函式,輸入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...