題目一(青蛙跳台階):
一只青蛙一次可以跳上1級台階,也可以跳上2級。求該青蛙跳上一個n級的台階總共有多少種跳法。
分析:
假設只有一級台階,則總共只有一種跳法;
假設有兩級台階,則總共有兩種跳法;
假設有n級台階,那么第一步就要分為跳一步和跳兩步:
跳一步,那么接下來就是跳n-1;
跳兩步,那么接下來就是跳n-2;
所以,總數可以認為是f(n-1)+f(n-2)。
主要代碼:
def frog(num):
if num <= 2:
return num
t1, t2 = 1, 2
for _ in range(3, num+1):
t1, t2 = t2, t1+t2
return t2
題目二(變態跳台階):
一只青蛙一次可以跳上1級台階,也可以跳上2級......它也可以跳上n階。求該青蛙跳上一個n級的台階總共有多少種跳法。
分析:
相比之前的跳台階,這次可以從任意台階跳上n級,所以總體來看與上一個問題差不多,只不過遞歸公式應該是各個台階之和再加上直接跳上去的情況,所以總數應該是f(n-1)+f(n-2)+f(n-3)+...+f(2)+f(1)=2**n-1。
主要代碼:
def frog(num):
if num==0:
return 0
return 2**(num-1)
拓展問題(矩形覆蓋):
我們可以用2*1的小矩形橫着或者豎着去覆蓋更大的矩形。請問用n個2*1的小矩形無重疊地覆蓋一個2*n的大矩形,總共有多少種方法?
分析:
這個問題實際上就是普通的跳台階問題,只不過說法不一樣而已。
假設n=1,則只有一種方法;
假設n=2,則共有兩種方法;
假設n=3,則分為兩種情況:
第一次用一個矩形豎着覆蓋(左圖陰影),則剩下共有2(n-1)種方法
第二次用一個矩形橫着覆蓋(右圖藍色),那么下方區域只剩下圖示一種方法,所以剩下1(n-2)種方法
最后可以看出求矩形覆蓋問題和求青蛙跳台階問題的通式是一樣的,它們都符合斐波那契數列的通式,即f(n-1)+f(n-2)
主要代碼:
def rectangle(num):
if num <= 2:
return num
t1, t2 = 1, 2
for _ in range(3, num+1):
t1, t2 = t2, t1+t2
return t2
通過這幾個題目我們可以看出,其實很多題目都有共通之處,甚至有些題目的變題會更簡單,所以我們需要從平時開始積累,日積月累下來,我們見識過的題目多了,自然而然寫代碼的水平就上去了。