有50層台階,乙個人每步可以上一層或者兩層,問一共有多少種上樓的方式。
50層可以由 49 層跨一步,也可以由48層跨兩步,49層則可以由48層跨一步或者47層跨兩步,…只有第1層只能由第0層跨一步到達,由此可見,當n>1 時, 第 n 層可由 n-1 層跨一步或者 n-2 層跨兩步到達。
package main
import
("fmt"
"time"
)func
main()
func
deal
(m int8
, s int
)int
s++return s
}
輸出結果
一段樓梯有n個台階,每次只能上一層台階或者兩層台階,輸出總所有多少種上樓的可能。
輸入 n
50計算開始 2020-09-14 15:30:20.253355305 +0800 cst m=+1.608072579
計算結束 2020-09-14 15:32:34.116474064 +0800 cst m=+135.471191265
20365011074
可以發現,雖然結果已經算出來了,但是通過輸入 n 的變化可以發現,隨著 n 的變大,計算的時間會增加的誇張,50層的計算已經需要 14 s的時間了。
50 層可以由49層跨一步,也可以由48層跨兩步,這裡我們程式裡會分為兩種情況去計算,一種計算49層如何到達,一種計算48層怎麼到達,然後49層就可以由48層跨一步或47層跨兩步,這裡又會計算48層怎麼到達了,但是之前在計算50層如何到達的一種可能中就是48層如何到達,這裡明細可以發現有重複的計算,所以我們可以使用乙個字典去存已經計算過的資料,比如我們要計算48層如何到達,首先先看這個字典裡有無48層的結果,如果有我們就直接用,不在去計算了,如果沒有,則計算後插入字典。
package main
import
("fmt"
"time"
)var gmap =
make
(map
[int8
]int
)func
main()
//優化前
func
deal
(m int8
, s int
)int
s++return s
}// 優化後
func
dealplus
(m int8
, s int
)int
else
if ok2
else
return onesetp + twosetp
} s++
return s
}
優化後輸出
一段樓梯有n個台階,每次只能上一層台階或者兩層台階,輸出總所有多少種上樓的可能。
輸入 n
50計算開始 2020-09-14 15:30:05.80893695 +0800 cst m=+3.284548177
計算結束 2020-09-14 15:30:05.809395276 +0800 cst m=+3.285006492
20365011074
可以看出優化後的計算時間耗時為毫秒級
一段樓梯有n個台階,每次至少跨一層,至多跨m層,輸出總共有多少種上樓的可能。
首先考慮 樓梯高度只有 m 層,每次至多跨 m 層,有多少種可能。當 m = 1 時,只有一種可能,當 m = 2 時,有兩種可能,當 m = 3 時,有 4 種可能,m = 4 時,8種可能, m = 5 時,有 16 種可能…大概可以推測出 當 m = n 時, 有 2 的 (n-1 ) 次方種可能。
推測只是讓我們找到思路去驗證,並不代表推測的就一定是對的,沒有驗證的推測都是耍流氓。
驗證: m 層 可由 m-1 ,m-2 ,… ,1 ,0層跨對應的1,2,…,m-1,m 層到達。入股以 s(m)作為到達 m 層的可能。 當 m >=1 時,則 s( m ) = s( m -1 ) + s( m-2 ) +…+s(1) +s(0) 注: s(0) = 1 。
熟悉又陌生的感覺,然後開始夢回高中
因為 s(m) = s( m-1 ) + s(m-2) +.....+ s(1) +s(0)
s ( m-1) = s(m-2) +s(m-3)+....+s(1)+s(0)
所以 s(m) - s(m-1) = s( m-1 )
即 s(m) = 2 x s(m-1)
又因為 s(1) = s(1-1) = s(0) = 0
所以 s(m)= 2 的 m -1 次方
所以可得,當樓層 n <= m 時,上樓的可能為 2 的 n-1 次方。
當樓層 n > m 時,和前面 50 層樓,每次 1-2 層台階的問題幾乎一致。
s(n) = s( n-1) + s( n-2 ) +....+ s(n-m)
func
dealplusplus
(m int
, s int
, max int
)int
else
}return tmp
} s =
int(math.
pow(2,
float64
(m-1))
)return s
}
演算法 台階問題 遞迴解決
0 注意 0級台階有0種方法,如果n 1,f 0 1 1 這裡的f n 代表的是n個台階有一次1,2,n階的 跳法數。2 n 1時,只有1種跳法,f 1 1 3 n 2時,會有兩個跳得方式,一次1階或者2階,這回歸到了問題 1 f 2 f 2 1 f 2 2 4 n 3時,會有三種跳得方式,1階 2...
C語言 遞迴解決青蛙跳台階問題
目錄 乙隻青蛙一次可以跳1級或2級台階,求當台階數為n時青蛙有多少種跳法。台階的數量為n。當 n 1 時,青蛙有一種跳法,即跳1級台階。當 n 2 時,青蛙有兩種跳法,即跳兩次1級台階或跳一次2級台階。當 n 3 時,青蛙可以先跳2級台階再跳1級台階,也可以選擇先跳1級台階再跳2級台階,或者是跳三次...
Go語言實現 劍指offer 跳台階
該題目 於牛客網 劍指offer 專題。乙隻青蛙一次可以跳上1級台階,也可以跳上2級。求該青蛙跳上乙個n級的台階總共有多少種跳法 先後次序不同算不同的結果 1階 共1種跳法 2階 共2種跳法 3階 共3種跳法 n階 先跳1級,還剩n 1級,跳法是f n 1 先跳2級,還剩n 2級,跳法是f n 2 ...