青蛙跳台阶的相关问题

问题一:青蛙一次只能跳 1 个台阶或者 2 个台阶, 计算从 0 台阶跳到 n 台阶有多少跳法,也就是的路径种类总和。

import java.util.HashMap;public class StepJump {// 当青蛙只能跳 1 个台阶或者 2 个台阶, 计算从 0 台阶跳到 n 台阶的路径种类总和// 这个类似斐波那契数列 1 1 2 3 5 8 13// f(0)=1, f(1)=1, f(2)=f(0)+f(1),[其中f(0)表示从0阶直接跳到2阶] f(3)=f(1)+f(2)// f(3)=f(1)+f(2)的解释:[先跳到1阶的路径种类(然后直接跳到3阶)+先跳到2阶的路径种类(然后直接跳到3阶)]private static int fun1(int n) {if(n < 2)return 1;// [先跳到n-1阶的路径种类(然后直接跳到n阶)+先跳到n-2阶的路径种类(然后直接跳到n阶)]return fun1(n-1)+fun1(n-2); // 递归}// 避免重复计算,可用一个 HashMap 存储计算过的值,防止重复计算。private static int fun2(int n, HashMap<Integer, Integer> map) {if(n < 2)return 1;// 如果map包含 n 对应的值,直接返回if(map.containsKey(n))return map.get(n);// 递归求值,和fun1()同样道理int first = fun2(n-1, map);int second = fun2(n-2, map);int sum = first + second;// 储存值,方便下次寻找map.put(n, sum);return sum;}// 利用循环计算,效率更高private static int fun3(int n) {if(n < 2)return 1;int first = 1, second = 1, sum = 0;while(n-- >= 2) {sum = first + second;first = second;second = sum;}return sum;}public static void main(String[] args) {int  n = 40;long time = System.nanoTime();System.out.println(fun1(n));System.out.println("递归时间:" + (System.nanoTime() - time));time = System.nanoTime();System.out.println(fun2(n, new HashMap<Integer, Integer>()));System.out.println("HashMap时间:" + (System.nanoTime() - time));time = System.nanoTime();System.out.println(fun3(n));System.out.println("循环时间:" + (System.nanoTime() - time));}
}
/* Code Running Results:(每次结果可能不同)* 165580141* 递归时间:347549100* 165580141* HashMap时间:114000* 165580141* 循环时间:21000*/

问题二:青蛙一次能跳 1 到 n 个台阶, 计算从 0 台阶跳到 n 台阶有多少跳法,也就是的路径种类总和。

public class StepJumpTwo {// 青蛙一次能跳 1 到 n 个台阶, 计算从 0 台阶跳到 n 台阶的路径种类总和// f(n)  = f(n-1)+f(n-2)+......+f(1)+f(0)------a式子// f(n-1)= f(n-2)+f(n-3)+......+f(1)+f(0)------b式子// (a式子)-(b式子)得  f(n)-f(n-1)=f(n-1)// 最终得到 f(n)=2*f(n-1)的等比数列,该等比数列为2^(n-1)private static int fun(int n){if(n < 2)return 1;return 1<<(n-1);  // 位运算,速度更快}public static void main(String [] args){System.out.println(fun(10));}
}
/* Code Running Results:* 512*/

问题三:青蛙一次能跳 1 到 m 个台阶, 计算从 0 台阶跳到 n 台阶有多少跳法,也就是的路径种类总和。

public class StepJumpThree {// 青蛙一次能跳 1 到 m 个台阶, 计算从 0 台阶跳到 n 台阶的路径种类总和// 情况1 n <= m 时,也就回到了问题二 f(n)=2*f(n-1), 等比数列为2^(n-1)// 情况2 当 n-1 = m 时// f(n)  = f(n-1)+f(n-2)+......+f(2)+f(1) 接下所有的计算又回到情况1//       = 2*f(n-2)+2*f(n-3)+......+2*f(1)+f(1)//       = ......//       = 2^(n-1)-1 (f(n)=2*f(n-1)的等比数列[2^(n-1)]的前 n-1 项和[2^(n-1)-1]// 情况3 当 n-1 > m 时// f(n)  = f(n-1)+f(n-2)+......+f(n-m+1)+f(n-m)------a式子// f(n-1)= f(n-2)+f(n-3)+......+f(n-m)+f(n-1-m)------b式子// (a式子)-(b式子)得  f(n)-f(n-1)=f(n-1)-f(n-1-m)// 最终得到 f(n)=2*f(n-1)-f(n-1-m)private static int fun(int n, int m){if(n < 2)return 1;if(n <= m)     // 情况1return 1<<(n-1);if(n-1 == m)   // 情况2return (1<<(n-1))-1;// 情况3return 2*fun(n-1, m)+fun(n-1-m, m);}public static void main(String [] args){System.out.println(fun(1, 5));  // n < 2System.out.println(fun(4, 5));  // 情况1System.out.println(fun(6, 5));  // 情况2System.out.println(fun(7, 5));  // 情况3}
}
/* Code Running Results:* 1* 8* 31* 63*/

青蛙跳台阶的相关问题相关推荐

  1. 356,青蛙跳台阶相关问题

    想了解更多数据结构以及算法题,可以关注微信公众号"数据结构和算法",每天一题为你精彩解答.也可以扫描下面的二维码关注 问题一: 一只青蛙一次可以跳上一级台阶,也可以跳上二级台阶,求 ...

  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. c++ string 头文件_“延期不延学” 第25期 | C++篇 | C/C++常用函数
  3. rust相框加载图片代码_Rust 能取代 Python,更好的实现神经网络?
  4. 文件加密问题(中文字符)
  5. 经典排序算法(12)——总结
  6. Centos7-Lvs+Keepalived架构实验详解
  7. 浅谈C#中的延“.NET研究”迟加载(2)——善用virtual
  8. wex5 导入mysql_wex5 sqllite本地数据库的运用
  9. Retrofit之CallAdapter简单解析
  10. 软件测试一个月工作总结范文,2019年最新软件测试师工作总结范文
  11. xshell查看hdfs文件目录路径_hdfs的shell操作
  12. 首个单季度盈利,ARPU增速却持续下滑,拼多多已埋下未来隐忧
  13. Javascript 实现的 CXK 打篮球游戏
  14. 回合制游戏指令的执行机制
  15. R语言使用duplicated函数去除重复项
  16. 网页脚本输入这么简单
  17. 余弦相似度:通过计算两个向量的夹角余弦值来评估他们的相似度
  18. oracle pga的作用,ORACLE PGA 的调整
  19. 机械革命s3和机械革命s3pro的区别 哪个好
  20. 现代微型计算机的字长,计算机的字长

热门文章

  1. 单口RAM、双口RAM、FIFO三者的关系
  2. ZED深度相机的使用--zed-ros-wrapper
  3. 802.1x认证详细剖析
  4. 一文让你彻底明白ThreadLocal
  5. 合肥对口计算机,2021年合肥市对口考试要做哪些题目?计算机应用基础(Windows7+office2010)周测月考单元卷...
  6. linux错误码中文解释,Linux命令之perror - 解释错误代码
  7. zotero插件推荐
  8. zotero-如何内置翻译插件
  9. baidu地图API
  10. 新浪微博OAuth2.0授权及使用python调用微博API