青蛙上楼梯matlab,一个小青蛙,可以一次跳两节楼梯,也可以一次跳一节楼梯,请问他如果要跳101节楼梯,一共有几种跳法方案? - 菲波那切数列...

一个小青蛙,可以一次跳两节楼梯,也可以一次跳一节楼梯,请问他如果要跳101节楼梯,一共有几种跳法方案?

问题的描述很简单,看到这个题目的时候,我首先想到的就是举例分析一波,比如当n=1的时候有几种方案,当n=2的时候有几种方案等等….

我们首先分析一波,当n=1的时候,这个时候小青蛙只有一种跳法,就是跳上台阶1,然后结束,当然这并不能帮助我们归纳总结,然后我们继续分析

当n=2的时候,这个时候,小青蛙可以跳上台阶1,也可以跳上台阶2结束,然后台阶1呢,也可以跳上台阶2然后结束,我们发现,如果光靠想象的话,很难发现其中的规律,这个时候我们需要借助图形来帮助我们.

下图是我自己用笔画的图形,建议在这种时候还是用笔在纸上写写画画来帮助我们

bVbvk0d

灵魂画手!!!

经过举例我们发现,得到的结果组成的数,特别像菲波纳斯数列,从n=3开始,每一项都等于前两项的和,为了验证一下我们的结论,我们可以在推导一下n=5的时候,一共有几种情况,很显然我们的结论是正确的.这就是一个求菲波纳斯数列的题,那么好,这个时候有人可能会说了,菲波纳斯数列是啥?能吃么?好,那我就从另外一个角度去分析这个题目

假如说,小青蛙现在已经跳上了第4个台阶,那么它上一个台阶是那一个呢?要想回答这个问题,我们还需要在看一下题目的介绍,题目说,小青蛙一次只能跳一个台阶或者跳两个台阶,那么这个答案很简单了,如果他现在在4,那么它的上一个台阶一定是3或者是2.

然后我们在思考.如果他现在处在第3个台阶呢,那么它的上一个台阶一定是2或者是1.

那你也许会有疑问了,知道了这个他的上一个台阶有啥用呢,我给大家举一个栗子大家就明白了

请问,1+1等于多少呢?如果我在问你,1+1+1的结果呢,很显而易见,我要告诉大家的不是这个等式的结果是多少,我想告诉大家的是算的过程,我们在算出来1+1之后,如果在算1+1+1,我们只需要将1+1的结果在加上1就好,反过来我们理解一下,如果你想算出来1+1+1,那我们是不是只需要算出1+1的结果呢,

类比到我们的这个算法,如果你想算出来小青蛙跳上第4个台阶一共有几种情况,那我们只需要算出来小青蛙跳上第3个的种类加上跳上第2个台阶的种类即可归纳出来的数学公式就是f(n)=f(n-1)+f(n-2).

我们把这个思路由代码实现出来,很简单,我们首先用递归去做.function jump(n) {

if (n === 1 || n=== 2) {

return n

}

return jump(n - 1) + jump(n - 2)

}

代码很简单,但是有一个很大的问题想算出来n=101,根本算不出来,浏览器执行的时间太长,当然,如果你愿意等,浏览器还是可以算出来的.

其实这个代码有一个很大的弊端就是,他会一直重复性的去计算,假设说我们已经算出来f(4)了,但是当我们在算f(5)的时候,这个函数又会从新去算一遍f(4),根据这个思路我们可以优化一下,我们通过一个数组去记录f(n),这样就不会重复性的去计算.function jump(n, memory = []) {

if (n === 1 || n=== 2) {

memory[n] = n

}

if (memory[n] !== undefined) {

return memory[n]

} else {

memory[n] = jump(n - 1, memory) + jump(n - 2, memory)

}

return memory[n]

}

改善后的代码,可以’ 秒’算出来结果了,但是我们的追求不能止步于此,我们在优化一下代码,这个代码是通过递归去做的,其实递归是很消耗性能的,我们直接通过循环去做

function jump(n) {let arr = [1, 2]

for (let i = 2; i< n; i++) {

arr [i] = arr[i - 1] + arr[i - 2]

}

return arr[n - 1]

}

最终我们对比通过循环代码和优化后的递归算法执行的时间,我们计算当n = 1000的时候的结果

bVbvk0i

结果显而易见.

最后分享给大家一句话: 大佬不是一天练成的!!!加油,咸鱼总有翻身的一天,就算翻身还是咸鱼,那它也是一条会翻身的咸鱼!!!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值