想了解更多数据结构以及算法题,可以关注微信公众号“数据结构和算法”,每天一题为你精彩解答。也可以扫描下面的二维码关注

问题一:
一只青蛙一次可以跳上一级台阶,也可以跳上二级台阶,求该青蛙跳上一个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. 青蛙跳台阶的相关问题

    青蛙跳台阶的相关问题 问题一:青蛙一次只能跳 1 个台阶或者 2 个台阶, 计算从 0 台阶跳到 n 台阶有多少跳法,也就是的路径种类总和. import java.util.HashMap;publ ...

  2. 青蛙跳台阶问题暨斐波那契数列

    1.问题描述 一只青蛙一次可以跳上 1 级台阶,也可以跳上 2 级.求该青蛙跳上一个 n 级的台阶总共有多少种跳法. 2.问题分析 设 f(n) 表示青蛙跳上 n 级台阶的跳法数.当只有一个台阶时, ...

  3. 青蛙跳石头java_Java青蛙跳台阶问题的解决思路与代码

    问题描述 一只青蛙一次可以跳上1级台阶,也可以一次跳上2级台阶,请问跳上n级台阶,该请娃一共有多少种跳法? 解决思路 ①如果只有1级台阶,那显然只有一种跳法. ②如果有2级台阶,那么就有2种跳法,一种 ...

  4. 入门C语言第二话:函数(上)之锻体篇,带你玩转函数(内有汉诺塔,青蛙跳台阶等经典问题,建议收藏和分享)

    文章目录 前言 概念的引入 大纲 一.函数的定义 二.函数的分类 1.库函数 概念引入 库函数的分类 了解五步骤 例1: 1.介绍printf 2.头文件 3.所传参数及其类型 4.返回类型及其返回值 ...

  5. 面试算法-青蛙跳台阶问题(JAVA实现)

    题干 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个 n级的台阶总共有多少种跳法(先后次序不同算不同的结果). 数据范围:0<= n <=40 要求:时间复杂度:O(n) ...

  6. 青蛙跳台阶:我如何得知它是一道斐波那契数列题?——应用题破题“三板斧”

    本文以C语言实现. 目录 前言 一.斐波那契阿数列基础知识 二.引例:青蛙跳台阶 三.破题分析:举例归纳 1. 三板斧的使用 举例 模拟(必要时画图) 找规律 2. 代码展示 四.拓展用例:矩形覆盖问 ...

  7. 自制青蛙跳台阶小游戏~

    青蛙跳台阶小游戏 1.概念(concept)文档 楔子(Setting):千百年来,人们在贬低别人时,常用井底之蛙来描述那个人,但这却让青蛙不开心了,于是青蛙决定跳出井底,为自己讨一个公道. 玩法(G ...

  8. 剑指offer:面试题10- II. 青蛙跳台阶问题

    题目:青蛙跳台阶问题 一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶.求该青蛙跳上一个 n 级的台阶总共有多少种跳法. 答案需要取模 1e9+7(1000000007),如计算初始结果为:10000 ...

  9. 斐波那契数列及青蛙跳台阶问题

    题目1: 写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项. 斐波那契(Fibonacci)数列定义例如以下: f(n)=⎧⎩⎨⎪⎪0,1,f(n−1)+f(n−2),n=0n=1n& ...

最新文章

  1. 为了方便读者检索和阅读以往的内容,已开通“号内搜”功能
  2. post json后台处理数据_Python爬虫教程-07-post介绍(百度翻译)(上)
  3. 计算机基础ABCDEF,计算机应用基础-在线作业ABCDEF.docx
  4. C# 文件操作之创建文件夹
  5. 动态网站的技术路线_3个好玩实用小网站!闲暇时间不妨打开看看
  6. 32 bit 与 64 bit 程序(2)比较
  7. 【华为云技术分享】看得见的安心,一手掌握华为云DRS迁移进度
  8. STM32工作笔记0008---TFT显示屏和LCD显示屏的区别
  9. 请领导批阅文件怎么说_有请考过的说物业经理资格证怎么考?
  10. JS来推断文本框内容改变事件
  11. 语言-英语-美国英语:美国英语
  12. SpringBoot项目打包成jar后,使用ClassPathResource获取classpath(resource)下文件失败
  13. 用SVM预测股票涨跌 - 免费分享全套代码
  14. Python穷举法连接WiFi
  15. 听听那冷雨 余光中
  16. Java学习:从入门到精通week3
  17. 新手怎么选择蓝牙耳机不被忽悠?注意这两大误区一定不猜雷
  18. 尚在人间,何处不青春
  19. jquery文字提示框
  20. idea2020.1.2 激活频繁失效问题分析与解决

热门文章

  1. 像素是计算机图像处理的最小单元,笔记本最小像素是什么
  2. C语言指针小结(一)---- *p++与*++p;(*p)++ 与 ++(*p)的解释
  3. linux桥接模式不能上网/ping不通主机解决方案
  4. 第五章 简单的数据查询
  5. python和php web负载均衡,实现负载均衡使用Python
  6. 乔布斯:人常怀激情可以让世界变得更美好
  7. 一个可以开机后自动和你打招呼的小程序(希望以后可以成为智能的系统)
  8. Vue父组件传给子组件数据,子组件得不到数据解决方法
  9. 全国一等奖,H题:用电器分析识别装置
  10. abaqus轮胎建模仿真 轮胎仿真建模