问题描述:爬 n 层楼梯 每次只能爬一步或者两步,如果爬了一个两步则接下来不能爬两步,只能爬一步,求最多有多少种方法。
通过上面这个简单的图形来看,这道题的核心无非就是上的楼梯数为1的时候,下次有上楼梯有两 种选择,反之只有一种选择。
下面为代码实现
<script>
// 递归实现:爬 n 层楼梯 每次只能爬一步或者两步,如果爬了一个两步则接下来不能爬两步,只能爬一步,求最多有多少种方法。
// 关键是设置步长来控制每次爬楼梯的阶数。
function plt(n,bc){
if(n < 0){
return 0;
}
if(n == 1){
return 1;
}
if(n == 2){//楼梯数为2时便需要开始判断步长。
//0对应起始位置,1则是上次了一步下次再走就有两种走法。
if( bc == 0 || bc == 1){
return 2;
}
if(bc == 2){//上次走了两步,下次则只能走一步。
return 1;
}
}
if(n > 2){//楼梯数大于二,判断上次的步长来绝定下次能走的步长,使用递归。
if(bc == 0){//0对应起始位置,所以下次有两种走法
return plt(n-1,1)+plt(n-2,2)//用逆向思维爬n层楼梯,不就是从n层楼梯往下退吗?所以是n-1或n-2。
}
if(bc == 1){//上次走一步,下次也有两种走法。
return plt(n-1,1)+plt(n-2,2)
}
if(bc == 2){//上次走两步,下次只有一种走法。
return plt(n-1,1)
}
}
}
console.log(plt(20,0))//1873
</script>