Leetcode 70.爬楼梯

77 阅读1分钟

规律

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;

}