樓梯演算法 重在思想

2022-03-16 06:01:07 字數 947 閱讀 5900

前一段時間遇到了乙個演算法題,印象非常深刻,題目也很簡單:

乙個人上樓梯,可以一次跨一階樓梯,也可以一次跨兩階,但是最多一次跨三階樓梯,請問,在 n 層樓梯的條件下,乙個人上樓梯總共有幾種方式?

舉個例子: 比方說有 1 層樓梯,乙個人只能跨一階上去,也就是只有 1 種上樓梯的方法;

若有 2 層樓梯,那麼可以一階一階地上,也可以一次跨兩階,也就是有 2 種上樓梯的方法;

若有 3 層樓梯,那麼可以一階一階地上,也可以先跨兩階+後跨一階,同樣也能先跨一階+後跨兩階,還可以一次跨三階,也就是有 4 種上樓梯的方法;

那麼如果有 n 層,那有幾種上方呢??(附加:可以都列出來嗎?)

思路:對於 n 層樓梯,分為三種情況:

1> 第一腳跨了一階樓梯,那麼就有 f(n - 1) 種上法(f 作為這個未知函式,返回 n 層樓梯有幾種上法);

2> 第一腳跨了兩階樓梯,那麼就有 f(n - 2) 種上法;

3> 第一腳跨了三階樓梯,那麼就有 f(n - 3) 種上法。

故:f(n) = f(n - 1) + f(n - 2) + f(n - 3)

有了這個關係,相信寫出乙個遞迴地求幾種上法的函式就不難了吧?

關鍵是:怎樣把它們都列出來呢?

我試著用 js 小小地實現了一下,效率不太高,僅供參考下,期待更好的答案。^ ^

(function(n)

} return t[n];

})(6);

執行結果:

["111111", "11112", "11121", "1113", "11211", "1122", "1131", "12111", "1212", "1221", "123", "1311", "132", "21111", "2112", "2121", "213", "2211", "222", "231", "3111", "312", "321", "33"]

爬樓梯演算法

有n階樓梯,有1,2,3 走m步走完樓梯,一共有多少種走法,並輸出所有的走法 設走n階台階的走法數為 f n 可以得到 f 1 1 f 2 2 f 3 4 對於n 3時,縮小問題規模 最後一步上乙個台階的話,之前上了n 1個台階,走法為f n 1 最後一步上兩個台階的話,之前上了n 2個台階,走法為...

演算法思想 滑動視窗思想

在解leetcode題的時候,遇到了幾個新的演算法思想,這個系列文章就把leetcode中的一些演算法思想做一些整理,包括老生常談的動態規劃,也包括我最新接觸的滑動視窗思想,並查集等,另外,遇到新的題目的時候也會在這裡做一些整理。起源 計算機網路協議 在介紹滑動視窗思想之前,首先介紹這個演算法思想的...

python爬樓梯演算法 爬樓梯(Python3)

假設你正在爬樓梯。需要 n 階你才能到達樓頂。每次你可以爬 1 或 2 個台階。你有多少種不同的方法可以爬到樓頂呢?注意 給定 n 是乙個正整數。示例 1 輸入 2 輸出 2 解釋 有兩種方法可以爬到樓頂。1 階 1 階 和 2 階 解題思路 實現了兩種方法,但是第一種超出時間限制 因為遞迴的時候方...