青蛙每次跳一阶或两阶,跳到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]
思路整理:
- 这里我们借助了递归来实现这种需求,因为只有跳一阶和跳两阶两种可能性,于是我们为所有没有跳到第十阶的可能性进行递归调用。
- 但是有的可能性中会出现十一阶的可能性,比如上一次我们的青蛙跳到了第九阶,那么这次它如果再跳2阶的话,可能就会变为十一阶,所有我们对于所有大于等于十阶的可能性都做跳出递归处理,然后单独对符合十阶的可能性做打印,这样就可以获得所有跳到十阶的可能性,共八十九种。
- 这里的十我们可以替换成任何数。
相关文章推荐
- 有1000阶的台阶,一个人每次只能走一阶或两阶,用一个递归算法求出共有多少种走法。
- 有1000阶的台阶,一个人每次只能走一阶或两阶,用一个递归算法求出共有多少种走法。
- 50个阶梯,你一次可以上一阶或两阶,走上去,共有多少种走法?
- 百度面试题01——50个阶梯,你一次可以上一阶或两阶,走上去,共有多少种走法?
- 腾讯面试题:50个阶梯,你一次可以上一阶或两阶,走上去,共有多少种走法
- 公鸡2文,母鸡1文,小鸡半文,每种至少一只,100文买100只鸡有多少可能性 共有哪几种可能
- 一只青蛙从第一级台阶跳到第n级,每次可以跳任意级,共有多少种跳法,并写出递推式
- 一只青蛙一次只能跳一阶或两阶台阶,总共要跳n阶,求总共有多少总跳法
- 凑钱1,2,5凑20元钱有多少可能 共有哪几种可能
- 腾讯面试题:50个阶梯,你一次可以上一阶或两阶,走上去,共有多少种走法
- 设元素入栈的顺序是1、2、3、…、n ,则所有可能的出栈序列共有几种
- 腾讯面试题:50个阶梯,你一次可以上一阶或两阶,走上去,共有多少种走法【原】
- 10阶层楼梯,每次只能走一阶或两阶,问有多少种走法?
- 有50级台阶,每次走一阶或两阶,有多少种走法?
- (C#)有一个10阶的楼梯 他有几种方式上去?("一次上一阶"和"一次上两阶")
- 百度面试题01——50个阶梯,你一次可以上一阶或两阶,走上去,共有多少种走法?
- 50个阶梯,你一次可以上一阶或两阶,走上去,共有多少种走法?
- 腾讯面试题:50个阶梯,你一次可以上一阶或两阶,走上去,共有多少种走法【原】
- opengl中深度冲突问题以及几种可能的解决方案
- 造成IOS程序崩溃的几种可能的原因