演算法 fbnc數列

2021-07-03 13:44:14 字數 1818 閱讀 4203

乙個台階總共有n 級,如果一次可以跳1 級,也可以跳2 級。

求總共有多少總跳法,並分析演算法的時間複雜度。

解法一首先考慮最簡單的情況。如果只有1級台階,那顯然只有一種跳法。如果有2級台階,那就有兩種跳的方法了:一種是分兩次跳,每次跳1級;另外一種就是一次跳2級。

現在我們再來討論一般情況。我們把n級台階時的跳法看成是n的函式,記為f(n)。

因此n級台階時的不同跳法的總數f(n)=f(n-1)+f(n-2)。

我們把上面的分析用乙個公式總結如下:

/  1                             n = 1

f(n)= 2 n = 2

\ f(n-1) + f(n-2) n > 2

原來上述問題就是我們平常所熟知的fibonacci數列問題。可編寫**,如下:

long

long

fibonacci(unsigned

int n)

; if (n <= 2)

return result[n];

return

fibonacci(n - 1) + fibonacci(n - 2);

}

那麼,如果乙個人上台階可以一次上1個,2個,或者3個呢?這個時候,公式是這樣寫的:

/ 1                                      n = 1

f(n)= 2 n = 2

4 n = 3 //111, 12, 21, 3

\ f(n-1)+f(n-2)+f(n-3) n > 3

解法二

解法一用的遞迴的方法有許多重複計算的工作,事實上,我們可以從後往前推,一步步利用之前計算的結果遞推。

初始化時,dp[0]=dp[1]=1,然後遞推計算即可:dp[n] = dp[n-1] + dp[n-2]。

參考**如下:

//1, 1, 2, 3, 5, 8, 13, 21..

intclimbstairs(int n)

; if (n < 2)

for (int i = 2; i <= n; i++)

return dp[2];

}

1、兔子繁殖問題

13世紀義大利數學家斐波那契在他的《算盤書》中提出這樣乙個問題:有人想知道一年內一對兔子可繁殖成多少對,便築了一道圍牆把一對兔子關在裡面。已知一對兔子每乙個月可以生一對小兔子,而一對兔子出生後.第三個月開始生小兔子假如一年內沒有發生死亡,則一對兔子一年內能繁殖成多少對?

分析:這就是斐波那契數列的由來,本節的跳台階問題便是此問題的變形,只是換了種表述形式。

2、換硬幣問題。

想兌換100元錢,有1,2,5,10四種錢,問總共有多少兌換方法。

const int n = 100;

int dimes = ;

int arr[n + 1] = ;

for (int i = 0; i < sizeof(dimes) / sizeof(int); ++i)

}

此問題還有乙個變形,就是列印出路徑目前只想到要使用遞迴來解決這個問題。對此,利用乙個vector來儲存路徑,每進入一層,push_back乙個路徑,每退出一層,pop_back乙個路徑。

演算法 js Fibonacci數列

斐波那契數列 fibonacci sequence 又稱 分割數列,因數學家列昂納多 斐波那契 leonardoda fibonacci 1 以兔子繁殖為例子而引入,故又稱為 兔子數列 指的是這樣乙個數列 0 1 1 2 3 5 8 13 21 34 用js寫出來的演算法 function fibo...

演算法訓練 數列

題目鏈結 錦囊1 進製處理。錦囊2先把原數按二進位制的方法轉成二進位制,然後再把轉換後的數看成k進製,再轉換回來。問題描述 給定乙個正整數k 3 k 15 把所有k的方冪及所有有限個互不相等的k的方冪之和構成乙個遞增的序列,例如,當k 3時,這個序列是 1,3,4,9,10,12,13,該序列實際上...

演算法 js Fibonacci數列

斐波那契數列 fibonacci sequence 又稱 分割數列,因數學家列昂納多 斐波那契 leonardoda fibonacci 1 以兔子繁殖為例子而引入,故又稱為 兔子數列 指的是這樣乙個數列 0 1 1 2 3 5 8 13 21 34 用js寫出來的演算法 function fibo...