青蛙每次跳一阶或两阶,跳到N阶共有几种可能

原来看到过一个有意思的算法题。

要求:青蛙每次跳台阶一阶或者两阶,现在共有N阶台阶,要求打印出所有可能性。

思路:首先每一次跳跃都是独立的,我们不知道青蛙下一步到底是跳一阶还是两阶,但好在我们知道它没有那么大的本事,只能跳一阶或者两阶。这样我们就能从这两种可能性中下手。

let ww = 0;
function jump(currentArr){
    let aa = currentArr.reduce((a,b) => {
        return a + b
    })//利用reduce对数组求和,也就是看当前在第几阶
    if(aa >= 10) { //如果当前十阶或以上,则跳出递归
        if( aa === 10 ){ //对我们想要的可能做打印和添加次数
            ww++
            console.log("第"+ ww +"种", currentArr.slice(1))
            return
        }
        return
    } else {
        jump([...currentArr, 1]);//这里我们用到了es6的数组结构,解决了一直用一个数组出现的问题
        jump([...currentArr, 2]);
     }
}

jump([0])

打印结果

第1种 (10) [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
第2种 (9) [1, 1, 1, 1, 1, 1, 1, 1, 2]
第3种 (9) [1, 1, 1, 1, 1, 1, 1, 2, 1]
第4种 (9) [1, 1, 1, 1, 1, 1, 2, 1, 1]
......
......
第85种 (7) [2, 2, 2, 1, 1, 1, 1]
第86种 (6) [2, 2, 2, 1, 1, 2]
第87种 (6) [2, 2, 2, 1, 2, 1]
第88种 (6) [2, 2, 2, 2, 1, 1]
第89种 (5) [2, 2, 2, 2, 2]

思路整理:

  1. 这里我们借助了递归来实现这种需求,因为只有跳一阶和跳两阶两种可能性,于是我们为所有没有跳到第十阶的可能性进行递归调用。
  2. 但是有的可能性中会出现十一阶的可能性,比如上一次我们的青蛙跳到了第九阶,那么这次它如果再跳2阶的话,可能就会变为十一阶,所有我们对于所有大于等于十阶的可能性都做跳出递归处理,然后单独对符合十阶的可能性做打印,这样就可以获得所有跳到十阶的可能性,共八十九种。
  3. 这里的十我们可以替换成任何数。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值