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,...