(js实现)剑指offer--跳台阶与变态跳台阶

跳台阶

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

分析

在本题里面,青蛙是只能跳1级或者2级的
当 n = 1, f(1) = 1
当 n = 2, f(2) = 2
当 n = 3, f(3) = 3
  ①第一种情况:先跳1级,于是剩下2级台阶 剩下2级台阶–>跳法不就是f(2)吗!
  ②第二种情况:先跳2级,于是剩下1级台阶 -> 跳法有 f(1) 种
  综合两种情况,总共跳法有:
  f(3) = f(2)(青蛙第一步跳1级)+ f(1)(青蛙第一步跳2级)
当 n = 4, f(4) = 3
  ①第一种情况:先跳1级,于是剩下3级台阶->跳法有 f(3)种
  ②第二种情况:先跳2级,于是剩下2级台阶 ->跳法有 f(2)种
  综合两种情况,总共跳法有:
  f(4) = f(3)(青蛙第一步跳1级)+ f(2)(青蛙第一步跳2级)
。。。
。。。
当 n = n, f(n) = f(n-1) + f(n-2)


综合: 当n < 4   f(n) = n
   当n >= 4  f(n) = f(n-1) + f(n-2)

function jumpFloor(number)
{
    // write code here
    if(number < 4){
        return number;
    }else{
        return (jumpFloor(number-1) + jumpFloor(number-2));
    }
}


变态跳台阶

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

分析

这道变态跳台阶和跳台阶不一样的地方是,这时候青蛙可以一次跳1-n级(跳台阶只能跳1级或2级),但是解题的思路是一样的

n级台阶,可以分为n 种情况
①第一步跳1级 -> 剩余阶梯 n-1 -> 跳法 f(n-1)
②第一步跳2级-> 剩余阶梯 n-2 -> 跳法 f(n-2)
③第一步跳3级-> 剩余阶梯 n-3 -> 跳法 f(n-3)
④第一步跳4级-> 剩余阶梯 n-4 -> 跳法 f(n-4)
。。。
第n种情况:第一步跳n级:一次跳完。。跳法当然只有一种啦!
f(n) = f(n-1) + f(n-2) + f(n-3) + f(n-4)…+1

so.。。。
当 n = 1 f(1) = 1;
当 n = 2 f(2) = 2;
当 n = 3 f(3) = f(2) + f(1) +1 = 4;
当 n = 4 f(4) = f(3) + f(2) + f(1) + 1 = 8

f(n) = f(n-1) + f(n-2) + f(n-3) + f(n-4)…+1
?是不是太复杂了?其实可以用高中数学知识化简一哈~?

①f(n) = f(n-1) + f(n-2) + f(n-3) + f(n-4)…+1
②f(n-1) = f(n-2) + f(n-3) + f(n-4)…+1
聪明的你肯定发现了: ①式加粗部分可以用②式也就是f(n-1)替换!
so…化简得到?

f(n) = f(n-1) + f(n-1) = 2*f(n-1) (n > 1)

然后我们就可以写代码啦:

function jumpFloorII(number)
{
    // write code here
    if(number <= 0){
        return 0;
    }
    else if(number === 1){
        return 1;
    }
    else{
        return 2*jumpFloorII(number-1);
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值