问题

  一只青蛙一次可以跳上 1 级台阶,也可以跳上2 级。求该青蛙跳上一个n 级的台阶总共有多少种跳法。

思路

  当n=1时,只有一种跳法,及f(1)=1,当n=2时,有两种跳法,及f(2)=2,当n=3时,可以从n=1直接跳到n=3,也可以从n=2直接跳到n=3,及f(3)=f(1)+f(2)=3...,所以可以使用递归,自顶向下,一步一步求解,但是仔细分析一下,如果n=10,需要求得f(9)和f(8),而f(9)=f(8)+f(7),f(8)=f(7)+f(6),可以很明显看到,求了重复的f(8)和f(7),随着n增大,这种复杂度是呈指数倍增长。

  1. package offer009;
  2.  
  3. import java.util.Scanner;
  4. import java.util.concurrent.TimeUnit;
  5.  
  6. /**
  7. * @Title: Main.java
  8. * @Package: offer009
  9. * @Description 青蛙跳台阶,递归实现(计算量大)
  10. * @author Han
  11. * @date 2016-4-18 下午1:24:17
  12. * @version V1.0
  13. */
  14.  
  15. public class Main {
  16.  
  17. public static void main(String[] args) {
  18.  
  19. Scanner scanner = new Scanner(System.in);
  20. int n = 0;
  21.  
  22. while(scanner.hasNext()){
  23.  
  24. n = scanner.nextInt();
  25. //开始时的纳秒
  26. long start = System.nanoTime();
  27. long steps = getSteps(n);
  28. //花费的纳秒数
  29. long during = System.nanoTime() - start;
  30. //将纳秒转换为毫秒
  31. long seconds = TimeUnit.MILLISECONDS.convert(during, TimeUnit.NANOSECONDS);
  32.  
  33. System.out.println(steps);
  34. System.out.println("当n为" + n + "时,花费时间为" + seconds + "毫秒");
  35. }
  36. }
  37.  
  38. private static long getSteps(int n) {
  39.  
  40. if(n < 1)
  41. throw new RuntimeException("Error Input");
  42.  
  43. if(n == 1)
  44. return 1;
  45. else if(n == 2)
  46. return 2;
  47. else
  48. return getSteps(n - 1) + getSteps(n - 2);
  49. }
  50. }

测试

  当n>40的时候,就会发现计算已经开始变慢了。

思路

  另一种解法,子底向上方法,类似于动态规划,此次的结果为下回计算的使用,大量减少计算时间。

  1. package offer009other;
  2.  
  3. import java.util.Scanner;
  4. import java.util.concurrent.TimeUnit;
  5.  
  6. /**
  7. * @Title: Main.java
  8. * @Package: offer009other
  9. * @Description 青蛙跳台阶,动态规划实现(计算量大)
  10. * @author Han
  11. * @date 2016-4-18 下午1:38:17
  12. * @version V1.0
  13. */
  14.  
  15. public class Main {
  16.  
  17. public static void main(String[] args) {
  18.  
  19. Scanner scanner = new Scanner(System.in);
  20. int n = 0;
  21.  
  22. while(scanner.hasNext()){
  23.  
  24. n = scanner.nextInt();
  25. //开始时的纳秒
  26. long start = System.nanoTime();
  27. long steps = getSteps(n);
  28. //花费的纳秒数
  29. long during = System.nanoTime() - start;
  30. //将纳秒转换为毫秒
  31. long seconds = TimeUnit.MILLISECONDS.convert(during, TimeUnit.NANOSECONDS);
  32.  
  33. System.out.println(steps);
  34. System.out.println("当n为" + n + "时,花费时间为" + seconds + "毫秒");
  35. }
  36. }
  37.  
  38. private static long getSteps(int n) {
  39.  
  40. long forgStepMinusOne = 2;
  41. long forgStepMinusTwo = 1;
  42. long steps = 0;
  43.  
  44. for(int i = 3; i <= n; i++){
  45.  
  46. //当前n步有的跳法
  47. steps = forgStepMinusOne + forgStepMinusTwo;
  48. //为下一次的计算做准备,此次求得是n+1-2步的跳法个数
  49. forgStepMinusTwo = forgStepMinusOne;
  50. //为下一次的计算做准备,此次求得是n+1-1步的跳法个数
  51. forgStepMinusOne = steps;
  52. }
  53.  
  54. return steps;
  55. }
  56. }

测试

总结

  递归实现Fibonacci数列易懂,但是进行了太多的无谓的计算。

青蛙跳台阶(Fibonacci数列)的更多相关文章

  1. 【Java】 剑指offer(9) 斐波那契数列及青蛙跳台阶问题

     本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项 ...

  2. [剑指offer]10.斐波那契数列+青蛙跳台阶问题

    10- I. 斐波那契数列 方法一 Top-down 用递归实现 def fibonacci(n): if n <= 0: return 0 if n == 1: return 1 return ...

  3. 青蛙跳台阶问题——剑指offer

    题目:一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶,求该青蛙跳上一个n级台阶总共有多少中跳法. http://www.nowcoder.com/books/coding-interviews?pa ...

  4. Python算法题(一)——青蛙跳台阶

    题目一(青蛙跳台阶): 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 分析: 假设只有一级台阶,则总共只有一种跳法: 假设有两级台阶,则总共有两种跳法: ...

  5. 【校招面试 之 剑指offer】第10-2题 青蛙跳台阶问题

    题目1:一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶.求该青蛙跳上一个n级台阶共有多少种跳法? 题目2:一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶...也可以一次跳n级台阶.求该青蛙跳上一个 ...

  6. 面试书上一些题目的整理:O(n)复杂度排序年龄 & 青蛙跳台阶

    可以按照年龄的个数,设置99个桶,然后桶内处理. 青蛙跳台阶,每次1阶或者2阶,就是fib数 如果每次1到n阶,那么归纳法可得,是2^(n-1) 另外1*2 覆盖 2*n个矩阵的问题,仍然是Fib数. ...

  7. 剑指 Offer 10- II. 青蛙跳台阶问题

    剑指 Offer 10- II. 青蛙跳台阶问题 Offer 10- II 题目描述: 动态规划方程: 循环求余: 复杂度分析: package com.walegarrett.offer; impo ...

  8. 剑指offer-第二章算法之斐波拉契数列(青蛙跳台阶)

    递归与循环 递归:在一个函数的内部调用这个函数. 本质:把一个问题分解为两个,或者多个小问题(多个小问题相互重叠的部分,会存在重复的计算) 优点:简洁,易于实现. 缺点:时间和空间消耗严重,如果递归调 ...

  9. 剑指offer 9-10:青蛙跳台阶与Fibonacii数列

    题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果). 问题分析 我们将跳法个数y与台阶数n视为一个函数关系,即y=f(n). ...

随机推荐

  1. openwrt: Makefile 框架分析

    openwrt: Makefile 框架分析 原文链接:blog.chinaunix.net/uid-26675482-id-4704952.html 本篇的主要目的是想通过分析Makefile,了解 ...

  2. JavaScript设计模式-单例模式、模块模式(转载 学习中。。。。)

    (转载地址:http://technicolor.iteye.com/blog/1409656) 之前在<JavaScript小特性-面向对象>里面介绍过JavaScript面向对象的特性 ...

  3. D3.js 交互式操作

    与图表的交互,指在图形元素上设置一个或多个监听器,当事件发生时,做出相应的反应. 一.什么是交互 交互,指的是用户输入了某种指令,程序接受到指令之后必须做出某种响应.对可视化图表来说,交互能使图表更加 ...

  4. Perl 语法 - 基础

    perl语言的核心是正则表达式,在文本处理上非常有优势,与python类似,但语法不同,perl的语法很灵活,用多了才会觉得好用. 常用知识点总结: perl语法类似于C语言(perl源于Unix), ...

  5. EL表达式 (详解)(转)

    EL表达式      1.EL简介 1)语法结构        ${expression} 2)[]与.运算符      EL 提供.和[]两种运算符来存取数据.      当要存取的属性名称中包含一 ...

  6. 如何设计一个RPC系统

    版权声明:本文由韩伟原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/162 来源:腾云阁 https://www.qclou ...

  7. 如何增加Asp.Net Core生成的模板网站中用户信息表中的列(AspNetUsers)

    环境: 1.VS2015 Community 14.0.25431.01 Update 3; 2.其他环境(具体哪一个影响不太清楚,都列在这儿) 使用的系统模板 利用系统提供的模板,并选择个人身份验证 ...

  8. eclipse插件在线发布发布和版本更新(web site) 转

    欢迎关注我的社交账号: 博客园地址: http://www.cnblogs.com/jiangxinnju/p/4781259.html GitHub地址: https://github.com/ji ...

  9. android AutoCompleteTextView 自定义BaseAdapter

    最近项目中需要做搜索功能,实现类似 Google.Baidu 搜索的 下拉提示效果.Android为我们提供了 AutoCompleteTextView 控件来完成此功能. 网上好多例子都是简单使用 ...

  10. Vim学习指南

    你想尽可能快地自学vim(为大家所熟知的最好的编辑器) .这是我学习的方法:从细处入手然后慢慢掌握所有技巧. Vim 六十亿美元的编辑器 设计优良,强壮,快速. 学习vim并把它作为你的下一个文本编辑 ...