您的位置:首页 > 其它

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

2019-06-04 17:30 274 查看
原来看到过一个有意思的算法题。

要求:青蛙每次跳台阶一阶或者两阶,现在共有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. 这里的十我们可以替换成任何数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐