Go 語言解決 50 層台階問題

2021-10-09 10:46:53 字數 2752 閱讀 8754

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