問題是這樣的:(1)乙隻青蛙一次可以跳上1級台階,也可以跳上2級求該青蛙跳上乙個n級的台階總共有多少種跳法。
問題再複雜點:(2)乙隻青蛙一次可以跳上1級台階,也可以跳上2級……它也可以跳上n級。求該青蛙跳上乙個n級的台階總共有多少種跳法。
這個是在牛客網上做程式設計訓練時碰到的第一題和第二題,題目要求的是利用遞迴的方式解決。
首先來分析下第乙個問題:
既然是遞迴的方式,先看看幾個簡單的例子:
有1級台階的時候,跳法有1種;
有2級台階的時候,跳法有2種;
有3級台階的時候,跳法有3種;
。。。。。
用n表示台階的數量,f(n)表示跳法的數量。
很容易得到,如果第一次跳1階的話,那麼就有f(n-1)次跳法了,如果第一次跳2階的話,那麼就有f(n-2)次跳法了,也就是:
f(n)=f(n-1)+f(n-2)
很熟悉的乙個表示式,斐波拉契數列啊。那麼程式就好解決了:
//c++**片段
class solution
};
#python**片段
# -*- coding:utf-8 -*-
class
solution:
defjumpfloor
(self,number):
if number < 0:
print
"error!"
if number == 1:
return
1; if number == 2:
return
2; else:
return self.jumpfloor(number-1)+self.jumpfloor(number-2)
有了對問題(1)的分析,再來分析問題(2)就容易了。同樣的分析:
有1級台階的時候,跳法有1種;
有2級台階的時候,跳法有2種;
有3級台階的時候,跳法有4種;
有4級台階的時候,跳法有8種;
可以看到與問題(1)的區別了。
假設有n級台階,如果第一次跳了1階,那麼就有f(n-1)種跳法,如果第一次跳了2階,那麼就有f(n-2)種跳法。。。如果第一次跳了n-1階,那麼就有f(n-(n-1))種跳法,那麼你可能發現了,這裡應該有:
f(2)=f(1)+f(0)才對,所以我們定義f(0)=1,這樣所有的情況就都符合了。也就是有:
f(n)=f(n-1)+f(n-2)+…+f(1)+f(0)
f(n-1)=(fn-2)+f(n-3)+…+f(1)+f(0)
由上面兩個式子可以得到
f(n)-f(n-1)=f(n-1)
f(n)=2*f(n-1)
ok!得到這個式子,再用**寫出來就易如反掌了。
//c++**片段
class solution2
};
#python**片段
# -*- coding:utf-8 -*-
class
solution1:
defjumpfloor2
(self,number):
if number == 0:
return
1if number == 1:
return
1else:
return
2*self.jumpfloor2(number-1)
感覺不是在拼**程式設計功底,完全是在拼數學功底啊!雖然我的**也很渣。。。寫python函式,在類中呼叫jumpfloor的時候竟然還忘記了self的使用,簡直是不能忍啊,需要看的太多了,繼續努力! 動態規劃問題《遞迴問題》1
leetcode 每日一題日常打卡 面試題 17.16 按摩師問題 首先是問題描述 乙個有名的按摩師會收到源源不斷的預約請求,每個預約都可以選擇接或不接。在每次預約服務之間要有休息時間,因此她不能接受相鄰的預約。給定乙個預約請求序列,替按摩師找到最優的預約集合 總預約時間最長 返回總的分鐘數。思考 ...
1 遞迴解決分魚問題
問題描述 a b c d e這5個人合夥夜間捕魚,凌晨時都已經疲憊不堪,於是各自在河邊的樹叢中找地方睡著了。第二天日上三竿時,a第乙個醒來,他將魚平分為5份,把多餘的一條扔回河中,然後拿著自己的乙份回家去了 b第二個醒來,但不知道a已經拿走了乙份魚,於是他將剩下的魚平分為5份,扔掉多餘的一條,然後只...
遞迴 例項1
已知有列表 l 3,5,8 10,13,14 15 18 1 寫出乙個函式print list lst 列印出列表中所有數字 print list l 2 寫出乙個函式sum list lst 返回列表中所有數字的和 print list sum list l 注 type x 可以返回乙個變數的型...