乙隻青蛙一次可以跳上1級台階,也可以跳上2級。求該青蛙跳上乙個n級的台階總共有多少種跳法。
1級台階:1種跳法
2級台階:2種跳法
3級台階:3種跳法
4級台階:5種跳法
。。。
即:台階級數和跳法總數的關係滿足斐波那契數列。
斐波那契數列:1,1,2,3,5,8,13,。。。
用求解斐波那契數列第n項的方式求解該題即可。
def
jumpfloor
(self, number):
list = [1,1]
while number > 0:
list[0],list[1] = list[1],list[0]+list[1]
number -= 1
return list[0]
為什麼青蛙跳台階的跳法數量剛好滿足斐波那契數列呢?
獲取答案第一步:了解斐波那契數列的定義(引自知乎):
獲取答案第二步:了解青蛙跳台階的定義(引自部落格):
獲取答案::
斐波那契數列和青蛙跳台階除初始條件略有差異,其通式完全一致。
設青蛙跳上n級台階有f(n)種方法,把這n種方法分為兩大類,第一種最後一次跳了一級台階,這類方法共有f(n-1)種,第二種最後一次跳了兩級台階,這種方法共有f(n-2)種,則得出遞推公式f(n)=f(n-1)+f(n-2),顯然,f(1)=1,f(2)=2,遞推公式如下:
* 這種方法雖然**簡單,但效率低,會超出時間上限*
**實現如下
class
solution:
# @param n
# @return
defclimbstairs
(self, n):
if n==1:
return
1elif n==2:
return
2else:
return self.climbstairs(n-1)+self.climbstairs(n-2)
這種方法的原理仍然基於上面的公式,但是用迴圈代替了遞迴,比上面的**效率上有較大的提公升,可以ac
**實現如下:
class
solution:
# @param n
# @return
defclimbstairs
(self, n):
if n==1
or n==2:
return n
a=1;b=2;c=3
for i in range(3,n+1):
c=a+b;a=b;b=c
return c
這種方法我比較喜歡設青蛙跳上這n級台階一共跳了z次,其中有x次是一次跳了兩級,y次是一次跳了一級,則有z=x+y ,2x+y=n,對乙個固定的x,利用組合可求出跳上這n級台階的方法共有
種方法
又因為 x在區間[0,n/2]內,所以我們只需要遍歷這個區間內所有的整數,求出每個x對應的組合數累加到最後的結果即可
python**實現如下:
class
solution:
# @param n
# @return
defclimbstairs
(self, n):
deffact
(n):
result=1
for i in range(1,n+1):
result*=i
return result
total=0
for i in range(n/2+1):
total+=fact(i+n-2*i)/fact(i)/fact(n-2*i)
return total
劍指offer 8 跳台階
題目描述 乙隻青蛙一次可以跳上1級台階,也可以跳上2級。求該青蛙跳上乙個n級的台階總共有多少種跳法 思路 由題可知,青蛙跳台階,跳上n階,可以一階一階的跳,也可以兩階兩階的跳,還可以交叉來。如果函式f n 表示跳到n階的方法,那麼如果最後一次跳一階,則前面有f n 1 種,如果最後是跳2階,則前面有...
劍指Offer 8 跳台階
乙隻青蛙一次可以跳上1級台階,也可以跳上2級。求該青蛙跳上乙個n級的台階總共有多少種跳法。coding utf 8 class solution def jumpfloor self,number write code here if number 0 return 0 a 1 b 1 for in...
劍指offer8 跳台階
乙隻青蛙一次可以跳上1級台階,也可以跳上2級。求該青蛙跳上乙個n級的台階總共有多少種跳法。假設,一級台階,有f 1 種方法,二級有f 2 種,以此類推,n級有f n 種方法。可以看出,f 1 1 f 2 2。那麼,假設n級台階,那麼第一步就有兩種情況,跳一步,跟跳兩步。情況一 跳一步,那麼接下去的就...