无意中又刷到的一道经典的递归/动态规划问题,整理一下自己的解法
题目:每次爬 1 或 2 个台阶,爬上n阶有几种爬法?
1.直接递归:简单暴力,但复杂度.. 不仅会有很多重复计算,还有可能栈溢出
var climbStairs1 = function(n) {
if(n<=2){
return n;
}
return climbStairs1(n-1) + climbStairs1(n-2);
};
console.log(climbStairs1(3));
2.优化递归:使用一个Map来记录已经计算过的值,时间复杂度大大降低
var climbStairs2 = function(n,map) {
if(n<=2){
return n;
}
// 如果F(n)计算过 直接取出来
if(map.get(n)){
return map.get(n);
}else{
let value = climbStairs2(n-1,map) + climbStairs2(n-2,map);
map.set(n,value);
return value;
}
}
console.log(climbStairs2(8,new Map()));
3.动态规划:这个就没啥说的了,经典案例,比如要求走到第4阶的走法,因为每次走1或2,因此上一步一定是在2或3,因此只要求(1~2的走法+1~3的走法)即可,依次类推
var climbStairs3 = function(n){
let result = new Array(n+1);
result[1] = 1; //到第一阶有1种
result[2] = 2; //到第二阶有2种
for(let i = 3; i<n+1; i++){
result[i] = result[i-1] + result[i-2];
}
return result[n];
}
console.log(climbStairs3(8));