青蛙上楼梯matlab,一个小青蛙,可以一次跳两节楼梯,也可以一次跳一节楼梯,请问他如果要跳101节楼梯,一共有几种跳法方案? - 菲波那切数列...
一个小青蛙,可以一次跳两节楼梯,也可以一次跳一节楼梯,请问他如果要跳101节楼梯,一共有几种跳法方案?
问题的描述很简单,看到这个题目的时候,我首先想到的就是举例分析一波,比如当n=1的时候有几种方案,当n=2的时候有几种方案等等….
我们首先分析一波,当n=1的时候,这个时候小青蛙只有一种跳法,就是跳上台阶1,然后结束,当然这并不能帮助我们归纳总结,然后我们继续分析
当n=2的时候,这个时候,小青蛙可以跳上台阶1,也可以跳上台阶2结束,然后台阶1呢,也可以跳上台阶2然后结束,我们发现,如果光靠想象的话,很难发现其中的规律,这个时候我们需要借助图形来帮助我们.
下图是我自己用笔画的图形,建议在这种时候还是用笔在纸上写写画画来帮助我们
灵魂画手!!!
经过举例我们发现,得到的结果组成的数,特别像菲波纳斯数列,从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的时候的结果
结果显而易见.
最后分享给大家一句话: 大佬不是一天练成的!!!加油,咸鱼总有翻身的一天,就算翻身还是咸鱼,那它也是一条会翻身的咸鱼!!!
青蛙上楼梯matlab,一个小青蛙,可以一次跳两节楼梯,也可以一次跳一节楼梯,请问他如果要跳101节楼梯,一共有几种跳法方案? - 菲波那切数列...相关推荐
- 数楼梯--高精度递推、菲波那切数列
题目描述 楼梯有 N 阶,上楼可以一步上一阶,也可以一步上二阶. 编一个程序,计算共有多少种不同的走法. 输入格式 一个数字,楼梯数. 输出格式 输出走的方式总数. 输入样例 4 输出样例 5 说明/ ...
- 求菲波那切数列数列第n项三种方法小结
菲波那切数列数列的应用场景还是比较多的,比如可以在考试的时候考你递归啊,早上碰到的一道题就是这样,骄傲地写下递归方程,结果TLE了,然后旁边的大神给我说了一个叫滚动数组的东西...题目是这样的You ...
- 剑指offer:菲波那切数列
一.题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项.n<=39 解题思路: 菲波那切数列:指的是这样一个数列:1.1.2.3.5.8.13.21.34.- ...
- php菲波那切数列,php实现菲波那切数列和杨辉三角
1.递归 显示斐波那契数列 function recursion($num){ //判断是否小于0 if($num<0){ return -1; } if($num==1){ return 0 ...
- 菲波那切数列案例演示(递归方法)
/** * 功能:菲波那切数列案例演示(递归方法) * 详情:斐波那契数,亦称之为斐波那契数列(意大利语: * Successione di Fibonacci),又称黄金分割数列.费 * 波那西数列 ...
- python函数-返回菲波那切数列for,range,append
#返回菲波那切数列的列表 def fibs(num): fibs=[0,1] for i in range(num): fibs.append(fibs[-2]+fib ...
- 计算菲波那切数列前50项
计算菲波那切数列 前50项 public class Main {public static void main(String[] args) {// temp 1 表示第一个数 temp 2 表示第 ...
- 阶乘 c语言 fushu,JS递归实现阶乘和菲波那切数列
当我们需要使用递归来完成某些操作的时候,我们先要了解什么是递归 什么是递归? 递归,就是在运行的过程中调用自己. 一般来说,递归需要有边界条件.递归前进段和递归返回段. 当边界条件不满足时,递归前进: ...
- 008 -菲波那切数列
对第n位菲波那切数列的值进行求解 菲波那切数列 (1)递归方法实现 //递归实现斐波那契数列public static int calculateOne(int num) {if(num==0)ret ...
最新文章
- 年底了,没啥好送的,送个1T移动硬盘吧~
- 现代 JavaScript 函数库 usuallyjs 的安装和使用
- 第三周项目三-输出星号图(1)
- Windows Phone 8 企业应用部署指南(二)
- BZOJ.1029.[JSOI2007]建筑抢修(贪心)
- Struts项目中引入了过滤器filter后出现中文乱码情况
- [] ubuntu 14.04 搜狗拼音输入法安装
- SpringMVC返回JSON格式数据
- java单元测试的编写及运行方法
- 欧姆龙cp1h指令讲解_欧姆龙cp1h常用指令学习(十五)网络通讯指令SEND,RECV,CMND...
- 每日小结(就不平衡问题探讨)
- 银耳椰椰——Alpha冲刺Day08
- [515]歌曲识别-dejavu-python
- MFC 图标 icon 如何制作?
- java通信—网络聊天室网络画板(简陋版)
- Android获取系统相册图片选中地址,获取手机中的所有图片地址自定义相册
- 漫谈Web Feed、RSS、原文链接和转贴
- ZDNS联合中兴为埃塞俄比亚建设国家顶级域名系统
- css选择器优先级及权重计算
- ES聚合查询详解(二):桶聚合
热门文章
- Android写文件到手机中
- Thrift源码解析(二)序列化协议
- cytoscape安装java_Cytoscape史上最全攻略
- 如果有不限额度,稳定的Facebook广告账号,你也能爆单?!
- VCU 整车控制器应用层模型VCU模型,整车控制器基于工具包快速原型开发
- 网络安全笔记-POC与EXP的Python实现
- POJ3323 Bloxorz II BFS
- A NIR-to-VIS face recognition via part adaptive and relation attention module阅读笔记
- 【智能优化算法】基于凌日算法求解单目标优化问题附matlab代码Transit Search Optimization Algorithm
- 色彩鲜艳摄影调色效果lr预设