规律
f(n)={
1 n=1
2 n=2
f(n-1)+f(n-2) n>2
}
类似斐波拉切数列
f(n)={
0 n=0
1 n=1
f(n-1)+f(n-2) n>1
}
递归
function climbStairs(n){
if(n===1){
return 1
}
if(n===2){
return 2;
}
return climbStairs(n-1)+climbStairs(n-2)
}
递归的时候好多值都重复计算了,加入缓存
function climbStairs(n){
let map = new Map();
if(n===1){
return 1
}
if(n===2){
return 2;
}
if(map.get(n)){
return map.get(n);
}else{
let result = climbStairs(n-1)+climbStairs(n-2)
map.set(n,result);
return result;
}
}
但是函数调用堆栈层级还是太多了,用循环代替递归
function climbStairs(n){
if(n===1){
return 1
}
if(n===2){
return 2;
}
let pre=2;
let prepre=1;
var result;
for(let i=3;i<=n;i++){
result = pre+prepre;
prepre = pre;
pre = result;
}
return result;
}