劍指offer 8 跳台階 by Python

2021-09-24 12:41:07 字數 2413 閱讀 5422

乙隻青蛙一次可以跳上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級台階,那麼第一步就有兩種情況,跳一步,跟跳兩步。情況一 跳一步,那麼接下去的就...