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...