2、爬楼梯 编代码

题目描述:

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

方法分析:

这道题主要是要明白该爬楼梯的规律其实就是符合斐波那契数列(Fibonacci Sequence) 规律的,问题就迎刃而解了。为什么说它是斐波那契数列呢?我们可以这样来思考:当我们从第 n-1 阶楼梯爬到第 n 阶楼梯时,需要1步;当我们从第 n-2 阶楼梯爬到第 n 阶楼梯时,需要2步.也就是说 到达第 n 阶楼梯的方法数等于到达第 n-1 阶楼梯的方法数加上到达第 n-2 阶楼梯的方法数,其正好符合斐波那契通项。

1、采用递归实现

var climbStairs = function(n) {
    if(n == 1) return 1;
    if(n == 2) return 2;
    return climbStairs(n-1) + climbStairs(n-2);
};

递归是求解斐波那契数列最经典和最直接的方式,其简洁易懂;但是递归特别费时,在该题中使用会出现[超出时间限制]的错误提示。

2、数组方式

var climbStairs = function(n) {
    let result = [1,2];
    for (let i = 2; i < n; i++) {
        result.push(result[i-1] + result[i-2]);
    }
    return result[n-1];
};

数组方式大大的减少了运行时间,我们先预设好前两项,再得到结果,返回数组最后一项即可。
3、ES6的方式

var climbStairs = function(n) {
    let a = b = 1;
    for (let i = 0; i < n; i++) {
        [a, b] = [b, a + b];
    }
    return a;
};

其中 [a, b] = [b, a + b] 表示解构赋值,其等价于

temp = a;
a = b;
b = temp + b;

方法测速:

两种方法速度,数组快很多。
在这里插入图片描述
测速代码:

    console.time()
    var climbStairs = function (n) {
        let result = [1, 2];
        for (let i = 2; i < n; i++) {
            result.push(result[i - 1] + result[i - 2]);
        }
        return result[n - 1];
    };
    console.log(climbStairs(500),'数组');
    console.timeEnd();


    console.time()
    var climbStairs = function (n) {
        let a = b = 1;
        for (let i = 0; i < n; i++) {
            [a, b] = [b, a + b];
        }
        return a;
    };
    console.log(climbStairs(500),'ES6');
    console.timeEnd();
已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 1024 设计师:白松林 返回首页