遞迴問題的延展(斐波那契數列專場)

2021-09-22 20:00:06 字數 992 閱讀 9025

1、跳台階

乙隻青蛙一次可以跳上1級台階,也可以跳上2級。求該青蛙跳上乙個n級的台階總共有多少種跳法(先後次序不同算不同的結果)。

solution    1:

遞迴解決,自頂而下

確定一次只能跳上1階或2階,類似於斐波那契數列的問題,要求n階的跳法,只需確定了前兩項的階梯數後,依次往下遞迴求跳法

public int jumpfloor(int target)

3、矩形覆蓋

我們可以用2*1的小矩形橫著或者豎著去覆蓋更大的矩形。請問用n個2*1的小矩形無重疊地覆蓋乙個2*n的大矩形,總共有多少種方法?

solution    1:

依舊是斐波那契數列

2*n的大矩形,和n個2*1的小矩形

其中target*2為大矩陣的大小

有以下幾種情形:

1⃣️target <= 0 大矩形為<= 2*0,直接return 1;

2⃣️target = 1大矩形為2*1,只有一種擺放方法,return1;

3⃣️target = 2 大矩形為2*2,有兩種擺放方法,return2;

4⃣️target = n 分為兩步考慮:

第一次擺放一塊 2*1 的小矩陣,則擺放方法總共為f(target - 1)

第一次擺放一塊1*2的小矩陣,則擺放方法總共為f(target-2)

因為,擺放了一塊1*2的小矩陣(用√√表示),對應下方的1*2(用××表示)擺放方法就確定了,所以為f(targte-2)

具體實現:

public int rectcover(int target)

總結:

類似的斐波那契問題,都可以用數列的數學思想來推算,乙個方法是遞迴,另乙個方法是迭代(動態規劃),遞迴/迭代都是求出前兩項的確定結果,而後往後第n項就是求前兩項的總和,或應用數學規律直接解決問題。

一般來說,迭代的時間複雜度都小於遞迴。

遞迴與斐波那契數列

迭代實現 def fab n a1 1 a2 1 a3 1if n 1 print 輸入有誤 return 1 while n 2 0 a3 a1 a2 a1 a2 a2 a3 a 1return a3 result fab 20 if result 1 print 總共有 d對小兔子誕生 resu...

遞迴演算法斐波那契數列

有一對兔子,從出生後第3個月起,每個月都生一對兔子,小兔子長到第三個月後每個月又生一對兔子。假如兔子都不死,求第n個月兔子對數 關於斐波那契數列的兔子繁殖問題其實如下 實際月份 123 4567 8幼仔對數 101 1235 8成兔對數 011 2358 13總體對數 112 35813 21幼仔對...

遞迴實現斐波那契數列

斐波那契數列 f 1 1,f 2 1,f n f n 1 f n 2 n 3,n n package com.algorithm.tiger.recursion 遞迴和非遞迴方法實現斐波那契數列 斐波那契數列 f 1 1,f 2 1,f n f n 1 f n 2 n 3,n n descripti...