##题目
You are climbing a stair case. It takes n steps to reach to the top.
Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top?
Note: Given n will be a positive integer.
// 递归
var climbStairs = function(n) {
if (n <= 2) {
return n;
}
return climbStairs(n - 1) + climbStairs(n - 2);
};
// 动规
var climbStairs = function(n) {
if (n <= 2) return n;
var lastLast = 1;
var last = 2;
var now = lastLast + last;
var time = n - 2;
while (time--) {
now = lastLast + last;
lastLast = last;
last = now;
}
return now;
};
这个问题是个动态规划的题目,可以用以下思维思考: 1.当我在第x级梯子的时候,我有两个选择:一次上1级梯子和一次上2级梯子,反过来思考,当我爬到了第n级梯子的时候,我的上一步有两个选择:一次上1级梯子和一次上2级梯子,也就是F(n) = F(n - 1) + F(n - 2),因此我们可以很简单地用递归的方式求解; 2.我们已经可以将一个问题转化为两个子问题的和,现在我们只需要知道最底部的问题的解,就可以求解该问题,明显n = 1时,结果为1,n = 2时,结果为2;
我们就可以不断地根据前两个的结果求出第三个的结果,可以不使用递归,简单地保存前两次计算的结果即可通过循环的方式得到最终的结果。