JS实现跳台阶拓展问题

扩展一:一只青蛙一次可以跳上1级台阶,也可以跳上2级,但是不能连续两次跳两级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。

//分析:递归可以理解为下台阶
function climb(n, state){
   if(n === 0) {// 没有台阶下时,返回值为0,表示0种下台阶的方式
       return 0
   }
   if(n === 1){//递归出口,下一个台阶,返回值为0,表示1种下台阶的方式
       return 1
   }
   if(n === 2){//递归出口,下两个台阶,得分之前的状态,返回下台阶的方式
       if(state === 2){//状态为2,表示之前下过两次台阶,现在下台阶只有一种方式
           return 1
       }
       if(state === 1){//状态为1,表示之前下过一次台阶,现在下台阶有两种方式
           return 2
       }
   }
   if( n > 2){
       if(state === 0){//起始状态,下一个台阶就将状态设置为1,下两个台阶就将状态设置为2,
           return climb(n-1, 1) + climb(n-2, 2)
       }
       if(state === 1){//状态为1,也就是之前下了一个台阶,现在可以下一个台阶或者两个台阶
           return climb(n-1, 1) + climb(n-2, 2)
       }
       if(state === 2){//状态为2,也就是之前下了两个台阶,现在只能下一个台阶
           return climb(n-1, 2)
       }
   }
}
console.log(climb(7, 0))

扩展二:一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

//易知 f(n)=f(n-1)+f(n-2)+……f(1)
//f(n-1)=f(n-2)+……f(1)
//两式相减得f(n)=2f(n-1)
function jumpFloorII(number)
{
    // write code here
    if(number === 1) return 1
    return 2*jumpFloorII(number-1)
}

你可能感兴趣的:(JS实现跳台阶拓展问题)