题目描述:
假设你正在爬楼梯。需要 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();