走台階方式種數計算

2021-09-29 12:34:15 字數 2167 閱讀 9677

n階台階,假設每次走一步或兩步,計算共有多少種走法。

以f(n)表示走n-n階台階有多少種方式

n表示目前剩餘台階數

首先計算最終狀態(即走法少於2種的時候):

最終狀態為n=0,即到達終點記一種走法

當n=1時,走法只有f(n-1),所以也可直接返回1

中途每一台階都有兩種走法,所以有兩個遞迴函式呼叫,以分支形式,最終每條分支到達終點都會增加1種走法返回,所以最先呼叫的函式會獲得所有走法的記數

def

up(n)

:if n <2:

return

1else

:return up(n -1)

+ up(n -2)

# 兩種等價

defup

(n):

if n ==0:

return

1if n ==1:

return up(n -1)

# return 1 相等結果

else

:return up(n -1)

+ up(n -2)

+ up(n -

3)

擴充套件一下,若每次可走三步或者以上(走法有三種),只需先計算最終狀態,即走法少於三種的時候,分別為n=0,n=1,n=2,分別寫好對應走法,中途都有三種,三條分支。

**如下:

def

up(n)

:if n ==0:

return

1elif n ==1:

return up(n -1)

elif n ==2:

return up(n -1)

+ up(n -2)

else

:return up(n -1)

+ up(n -2)

+ up(n -

3)

遞推方式:(先求只走一步或兩步的問題)

同樣,先想最終狀態,最後第n階台階,我們有多少種方式能夠走上這一台階?

對於最後一階台階,我們只有兩種,即從n-2和n-1邁步過來,而且這兩種對於已走過的步數而言,是必須走的,並沒有增加種數,它僅等於走到前兩步所擁有的種數而已。

(n-2階台階走一步到n-1台階這一種方式其實已經記錄在了n-1這一階,所以說對於n-1,n-2來說,分別只有走一步和走兩步各一種走法,並沒有增加走台階種數)

所以f(n)=f(n-1)+f(n-2)

而因為滿足最優化結構,所以該方程可以遞推到所有步數,除了前2步確定走到第n步有多少種方式(n<=2)

因此,我們發現,其實只需記錄走到前兩步的走法即可

def

up2(n)

:if n ==0:

return

0elif n ==1:

return

1elif n ==2:

return

2else

: a =

1 b =

2for i in

range(2

, n)

: c = a + b

a = b

b = c

return c

走三步:

同樣,走到最終第n步,共有三個台階可走到,即前三個台階,而這三步對於前三個台階而言,已是唯一走法,所以:

f(n)=f(n-1)+f(n-2)+f(n-3),可一直倒推到最前面3步,這3步是確定走這3步到底會有多少種,供後面遞推時統計種數使用。

**如下:

def

up2(n)

:if n ==0:

return

0elif n ==1:

return

1elif n ==2:

return

2elif n ==3:

return

4else

: a =

1 b =

2 c =

4for i in

range(3

, n)

: d = a + b + c

a = b

b = c

c = d

return d

走台階問題

舉個例子,假設有3個台階,則有三種走法 分別是,1 1 1,1 2,2 1。很簡單的一道題,學過組合數學的人很快就能想到,這是乙個遞推關係。假設走完k個台階有f k 種走法。於是有如下公式 上面只給出了有多少種走法,那麼具體每一種走法是怎麼走的呢?比如n 4時,五種走法分別如下 1,1,1,1 1,...

走台階問題

舉個例子,假設有3個台階,則有三種走法 分別是,1 1 1,1 2,2 1。很簡單的一道題,學過組合數學的人很快就能想到,這是乙個遞推關係。假設走完k個台階有f k 種走法。於是有如下公式 遞迴演算法int count unsigned intn 非遞迴演算法int count unsigned i...

走台階問題

舉個例子,假設有3個台階,則有三種走法 分別是,1 1 1,1 2,2 1。很簡單的一道題,學過組合數學的人很快就能想到,這是乙個遞推關係。假設走完k個台階有f k 種走法。於是有如下公式 上面只給出了有多少種走法,那麼具體每一種走法是怎麼走的呢?比如n 4時,五種走法分別如下 1,1,1,1 1,...