问题描述
爬楼梯–每次只能走一步或者两步,但是不能连续走两步
结合上面的图形
如果用户的楼层大于了2的话,
走的方式就分为了两种,第一次走一步或者第一次走两步,当用户走一步的话,下一次的走法就有:走一步或者走两步;当用户走了两步的话,下一次的走法就只能走一步
function climbStairs(n, status) {
if (n < 0)
return 0;
if (n == 1)
return 1;
if (n == 2) { //当用户的阶梯只剩下2的时候,就需要判断最后一次走的状态(是一步还是两步)
if (status == 1 || status == 0 ) { //当状态是1或者是0的话,剩余的走法就还有两种(分别走两步和一次性走两步)
return 2
}
if (status == 2) { //当状态是2的话,剩余的走法就只有一种(走一步)
return 1
}
}
if (n > 2) { //当阶梯大于2的时候
if (status == 0) { //状态为0的时候,就相当于是如图中的底层,分为两个方向相加f(n-1)和f(n-2),但是需要将本次走的状态传递过去(需要使用递归,自己调用自己)
return climbStairs(n - 1, 1) + climbStairs(n - 2, 2)
}
if (status == 1) { //状态为1的时候,就相当于是如图中的底层的左边部分,又是分为两个方向相加f(n-1)和f(n-2),同样需要将本次次走的状态传递过去
return climbStairs(n - 1, 1) + climbStairs(n - 2, 2);
}
if (status == 2) { //状态为2的时候,就相当于是如图中的底层的右边部分,这里就只能有一种的走法了,所以递归过去的值就只剩下了f(n-1)
return climbStairs(n - 1, 1);
}
}
}
console.log(climbStairs(7, 0))