题目:
假设你正在爬楼梯。需要
n阶你才能到达楼顶。每次你可以爬1或2个台阶。你有多少种不同的方法可以爬到楼顶呢?
解题思路:
这个题用“从大到小”的方式思考很好解决:
先假设n = 10,那么最后一步有两种可能,即:从第8个爬2阶和从第9个爬1阶。 所以n = 8的结果加上n = 9的结果就是n = 10的结果。以此类推n=8的结果又是n=7和n=6的结果的和......(斐波那契数列)
递归解决:
var climbStairs = function(n) {
if (n < 1){
return 0;
}
if(n === 1){
return 1;
}
if (n === 2) {
return 2;
}
return climbStairs(n - 1) + climbStairs(n - 2);
};
但递归性能比较差,力扣会超时。可优化为遍历:
var climbStairs = function(n) {
if (n < 1){
return 0;
}
if(n === 1){
return 1;
}
if (n === 2) {
return 2;
}
var last = 1;
var prev = 2;
var ret = 0;
for (var i = 2; i < n; i++) {
ret = last + prev;
last = prev;
prev = ret;
}
return ret;
};