356,青蛙跳台阶相关问题
想了解更多数据结构以及算法题,可以关注微信公众号“数据结构和算法”,每天一题为你精彩解答。也可以扫描下面的二维码关注
问题一:
一只青蛙一次可以跳上一级台阶,也可以跳上二级台阶,求该青蛙跳上一个n级的台阶总共需要多少种跳法。
我们来分析一下:
当n等于1的时候,只需要跳一次即可,只有一种跳法,记f(1)=1
当n等于2的时候,可以先跳一级再跳一级,或者直接跳二级,共有2种跳法,记f(2)=2
当n等于3的时候,他可以从一级台阶上跳两步上来,也可以从二级台阶上跳一步上来,所以总共有f(3)=f(2)+f(1);
同理当等于n的时候,总共有f(n)=f(n-1)+f(n-2)(这里n>2)种跳法。
所以大家一看就知道这就是个斐波那契数列,只不过有一点不同的是斐波那契数列一般是以1,1,2,3,5,8,13……开始的,而我们这是以1,2,3,5,8,13……开始的,少了最前面的一个1。最代码很简单
public static int f(int n) {if (n < 3)return n;return f(n - 1) + f(n - 2);}
我们以计算f(6)为例画个图看一下计算的过程
我们看到递归会重复计算已经计算过的值,效率明显不是很高,我们还可以把计算过的值储存起来,防止重复计算,我们来看下代码
private static int f2(int n, HashMap<Integer, Integer> map) {if (n < 3) return n;if (map.containsKey(n))return map.get(n);int first = f2(n - 1, map);int second = f2(n - 2, map);int sum = first + second;map.put(n, sum);return sum;}
我们还可以把递归改为非递归的形式,看下代码
private static int f3(int n) {if (n < 3)return n;int first = 1, second = 2, sum = 0;while (n-- > 2) {sum = first + second;first = second;second = sum;}return sum;}
上面3种方式都可以实现青蛙跳台阶问题,那么哪种效率更高呢,我们来找个比较大的数据测试一下
public static void main(String[] args) {int step = 45;long time = System.nanoTime();System.out.println(f(step));System.out.println("代码优化前时间:" + (System.nanoTime() - time));time = System.nanoTime();System.out.println(f2(step, new HashMap<Integer, Integer>()));System.out.println("代码优化后时间:" + (System.nanoTime() - time));time = System.nanoTime();System.out.println(f3(step));System.out.println("代码非递归时间:" + (System.nanoTime() - time));}
来看一下运行的时间
1836311903代码优化前时间:22217419001836311903代码优化后时间:1080001836311903代码非递归时间:17600
我们看到递归优化之前运行时间是非常长的,优化之后时间大幅下降,但对于非递归来说又稍逊色了一些。
问题二:
一只青蛙一次可以跳上一级台阶,也可以跳上二级台阶……,也可以跳n级,求该青蛙跳上一个n级的台阶总共需要多少种跳法。
我们来分析一下
一只青蛙要想跳到n级台阶,可以从一级,二级……,也就是说可以从任何一级跳到n级,
所以递推公式我们很容易就能想到
f(n)=f(n-1)+f(n-2)+……+f(2)+f(1)+f(0);最后这个f(0)是可以去掉的,因为0级就相当于没跳,所以f(0)=0;
然后我们把f(0)去掉在转换一下:
f(n-1)=f(n-2)+f(n-3)+……+f(2)+f(1);
所以f(n)=f(n-1)+f(n-1)=2*f(n-1);他是一个等比数列,且f(1)=1;
我们我们可以得出f(n)=2^(n-1);代码如下
private static int f4(int n) {if (n == 1)return 1;return f4(n - 1) * 2;}
或者还可以改为非递归的
private static int f5(int n) {if (n == 1)return 1;return 1 << (n - 1);}
问题三:
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上m级。求该青蛙跳上一个n级的台阶总共有多少种跳法
这道题我们要分开讨论:
1,如果n<=m;因为只能往上跳不能往下跳,所以大于n的都不可以跳,如果跳了就直接超过了,只能跳小于等于n的数字,那么这个问题就直接退到问题2了。
2,如果n>m;我们要想跳到n级台阶,我们可以从n-1级跳一步上来,或者从n-2级跳两步上来……,或者从n-m级跳m步上来,所以我们可以找出递归公式
f(n) = f(n-1) + f(n-2) + f(n-3) + … + f(n-m);
进一步可以推出:
f(n-1) = f(n-2) + f(n-3) + … + f(n-m) + f(n-m-1);
化简结果为:
f(n) = 2f(n-1) - f(n-m-1);(n>m)
所以代码我们要分为两部分,一部分是n>m,另一部分是n<=m,我们来看下代码
public static int f6(int n, int m) {if (n <= 1)return 1;//总台阶大于跳的最高级台阶if (n > m)return 2 * f6(n - 1, m) - f6(n - 1 - m, m);//回退到上面的问题二了return 2 * f6(n - 1, n);}
斐波那契数列又称黄金分割数列,他有很多的特性,比如兔子的繁殖,他的通项公式如下
356,青蛙跳台阶相关问题相关推荐
- 青蛙跳台阶的相关问题
青蛙跳台阶的相关问题 问题一:青蛙一次只能跳 1 个台阶或者 2 个台阶, 计算从 0 台阶跳到 n 台阶有多少跳法,也就是的路径种类总和. import java.util.HashMap;publ ...
- 青蛙跳台阶问题暨斐波那契数列
1.问题描述 一只青蛙一次可以跳上 1 级台阶,也可以跳上 2 级.求该青蛙跳上一个 n 级的台阶总共有多少种跳法. 2.问题分析 设 f(n) 表示青蛙跳上 n 级台阶的跳法数.当只有一个台阶时, ...
- 青蛙跳石头java_Java青蛙跳台阶问题的解决思路与代码
问题描述 一只青蛙一次可以跳上1级台阶,也可以一次跳上2级台阶,请问跳上n级台阶,该请娃一共有多少种跳法? 解决思路 ①如果只有1级台阶,那显然只有一种跳法. ②如果有2级台阶,那么就有2种跳法,一种 ...
- 入门C语言第二话:函数(上)之锻体篇,带你玩转函数(内有汉诺塔,青蛙跳台阶等经典问题,建议收藏和分享)
文章目录 前言 概念的引入 大纲 一.函数的定义 二.函数的分类 1.库函数 概念引入 库函数的分类 了解五步骤 例1: 1.介绍printf 2.头文件 3.所传参数及其类型 4.返回类型及其返回值 ...
- 面试算法-青蛙跳台阶问题(JAVA实现)
题干 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个 n级的台阶总共有多少种跳法(先后次序不同算不同的结果). 数据范围:0<= n <=40 要求:时间复杂度:O(n) ...
- 青蛙跳台阶:我如何得知它是一道斐波那契数列题?——应用题破题“三板斧”
本文以C语言实现. 目录 前言 一.斐波那契阿数列基础知识 二.引例:青蛙跳台阶 三.破题分析:举例归纳 1. 三板斧的使用 举例 模拟(必要时画图) 找规律 2. 代码展示 四.拓展用例:矩形覆盖问 ...
- 自制青蛙跳台阶小游戏~
青蛙跳台阶小游戏 1.概念(concept)文档 楔子(Setting):千百年来,人们在贬低别人时,常用井底之蛙来描述那个人,但这却让青蛙不开心了,于是青蛙决定跳出井底,为自己讨一个公道. 玩法(G ...
- 剑指offer:面试题10- II. 青蛙跳台阶问题
题目:青蛙跳台阶问题 一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶.求该青蛙跳上一个 n 级的台阶总共有多少种跳法. 答案需要取模 1e9+7(1000000007),如计算初始结果为:10000 ...
- 斐波那契数列及青蛙跳台阶问题
题目1: 写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项. 斐波那契(Fibonacci)数列定义例如以下: f(n)=⎧⎩⎨⎪⎪0,1,f(n−1)+f(n−2),n=0n=1n& ...
最新文章
- 为了方便读者检索和阅读以往的内容,已开通“号内搜”功能
- post json后台处理数据_Python爬虫教程-07-post介绍(百度翻译)(上)
- 计算机基础ABCDEF,计算机应用基础-在线作业ABCDEF.docx
- C# 文件操作之创建文件夹
- 动态网站的技术路线_3个好玩实用小网站!闲暇时间不妨打开看看
- 32 bit 与 64 bit 程序(2)比较
- 【华为云技术分享】看得见的安心,一手掌握华为云DRS迁移进度
- STM32工作笔记0008---TFT显示屏和LCD显示屏的区别
- 请领导批阅文件怎么说_有请考过的说物业经理资格证怎么考?
- JS来推断文本框内容改变事件
- 语言-英语-美国英语:美国英语
- SpringBoot项目打包成jar后,使用ClassPathResource获取classpath(resource)下文件失败
- 用SVM预测股票涨跌 - 免费分享全套代码
- Python穷举法连接WiFi
- 听听那冷雨 余光中
- Java学习:从入门到精通week3
- 新手怎么选择蓝牙耳机不被忽悠?注意这两大误区一定不猜雷
- 尚在人间,何处不青春
- jquery文字提示框
- idea2020.1.2 激活频繁失效问题分析与解决
热门文章
- 像素是计算机图像处理的最小单元,笔记本最小像素是什么
- C语言指针小结(一)---- *p++与*++p;(*p)++ 与 ++(*p)的解释
- linux桥接模式不能上网/ping不通主机解决方案
- 第五章 简单的数据查询
- python和php web负载均衡,实现负载均衡使用Python
- 乔布斯:人常怀激情可以让世界变得更美好
- 一个可以开机后自动和你打招呼的小程序(希望以后可以成为智能的系统)
- Vue父组件传给子组件数据,子组件得不到数据解决方法
- 全国一等奖,H题:用电器分析识别装置
- abaqus轮胎建模仿真 轮胎仿真建模