n層樓梯,一次只能爬1個、2個台階,多少種爬樓梯的方法?
首先手動算一下n=1,2,3,4,5的情況
1
=>11
2=>21
+123
=>31
+1+1
2+11
+24=>51
+1+1
+12+
1+11
+2+1
1+1+
22+2
5=>81
+1+1
+1+1
2+1+
1+11
+2+1
+11+
1+2+
12+2
+11+
1+1+
22+1
+21+
2+2
可以總結出來,從3開始,爬法次數都是前兩個數字的和
但是我們只算到5,無法保證是否一定是這個規律,而且這個規律有什麼原因嗎?
認真思考,一次只可以爬1階或者2階,那麼一共5階的情況,最後一步要麼是1階要麼是2階
如果最後一步是1階,前邊要爬4階,這種情況就等於4階的爬法
如果最後一步是2階,前邊要爬3階,這種情況就等於3階的爬法
一共就這2種情況,所以5階的爬法就是4階的爬法+3階的爬法
同理,6階7階…都是這樣子的情況,4階、3階也是,2階和1階可以特殊處理
所以我們可以用遞迴的方法來計算,示例**如下
function
way(n)
else
if(n ===1)
else
if(n ===2)
else
return ret;
}
用這個方法可以計算出n階的爬法,但是在我的老破筆記本上,n>30時,就開始計算緩慢,n>40就出現幾秒鐘的等待才能計算出結果。
分析這個問題,遞迴函式呼叫本身會比for迴圈消耗效能,但是這裡主要還是因為計算量太大,那麼是否可以優化?
我們看下6階的遞迴情況
6階
5階 4階
3階2階
1階2階
3階2階
1階4階 3階
2階1階
2階
可以看出來,4階重複計算2次,3階重複計算3次。這是一共6階的情況,那麼數字比較大的時候,就會有更多的重複計算。這個時候就可以考慮空間換時間(計算),把已經計算過的值快取下來,示例**如下
const cache =
;function
waycache
(n)if
(n ===1)
if(n ===2)
if(cache[n]
)return cache[n]
=waycache
(n -1)
+waycache
(n -2)
;}
這樣子計算,速度就會非常快
其實這個問題還可以用for來解決,示例**如下
function
wayfor
(n)if
(n ===
1|| n ===2)
let one =1;
let two =2;
let result =0;
for(
let i =
2; i < n; i++
)return result;
}
python爬樓梯演算法 爬樓梯(Python3)
假設你正在爬樓梯。需要 n 階你才能到達樓頂。每次你可以爬 1 或 2 個台階。你有多少種不同的方法可以爬到樓頂呢?注意 給定 n 是乙個正整數。示例 1 輸入 2 輸出 2 解釋 有兩種方法可以爬到樓頂。1 階 1 階 和 2 階 解題思路 實現了兩種方法,但是第一種超出時間限制 因為遞迴的時候方...
爬樓梯演算法
有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個台階,走法為...
演算法之爬樓梯
題目 假設你正在爬樓梯。需要 n 階你才能到達樓頂。每次你可以爬 1 或 2 個台階。你有多少種不同的方法可以爬到樓頂呢?沙雕解法一 利用遞迴,就是最後一步一定是前一步走一步或倒退兩步走兩步,超時!include pch.h include include using namespace std i...