博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
青蛙跳台阶(Fibonacci数列)
阅读量:4708 次
发布时间:2019-06-10

本文共 2977 字,大约阅读时间需要 9 分钟。

问题

  一只青蛙一次可以跳上 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增大,这种复杂度是呈指数倍增长。

package offer009;import java.util.Scanner;import java.util.concurrent.TimeUnit;/**  * @Title: Main.java * @Package: offer009 * @Description 青蛙跳台阶,递归实现(计算量大) * @author Han * @date 2016-4-18 下午1:24:17  * @version V1.0 */       public class Main {        public static void main(String[] args) {                Scanner scanner = new Scanner(System.in);        int n = 0;                while(scanner.hasNext()){                        n = scanner.nextInt();            //开始时的纳秒            long start = System.nanoTime();            long steps = getSteps(n);            //花费的纳秒数            long during = System.nanoTime() - start;            //将纳秒转换为毫秒            long seconds = TimeUnit.MILLISECONDS.convert(during, TimeUnit.NANOSECONDS);                        System.out.println(steps);            System.out.println("当n为" + n + "时,花费时间为" + seconds + "毫秒");        }    }    private static long getSteps(int n) {                if(n < 1)            throw new RuntimeException("Error Input");                if(n == 1)            return 1;        else if(n == 2)            return 2;        else            return getSteps(n - 1) + getSteps(n - 2);    }}

 

测试

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

 

思路

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

package offer009other;import java.util.Scanner;import java.util.concurrent.TimeUnit;/**  * @Title: Main.java * @Package: offer009other * @Description  青蛙跳台阶,动态规划实现(计算量大) * @author Han * @date 2016-4-18 下午1:38:17  * @version V1.0 */       public class Main {        public static void main(String[] args) {                Scanner scanner = new Scanner(System.in);        int n = 0;                while(scanner.hasNext()){                        n = scanner.nextInt();            //开始时的纳秒            long start = System.nanoTime();            long steps = getSteps(n);            //花费的纳秒数            long during = System.nanoTime() - start;            //将纳秒转换为毫秒            long seconds = TimeUnit.MILLISECONDS.convert(during, TimeUnit.NANOSECONDS);                        System.out.println(steps);            System.out.println("当n为" + n + "时,花费时间为" + seconds + "毫秒");        }    }    private static long getSteps(int n) {                long forgStepMinusOne = 2;        long forgStepMinusTwo = 1;        long steps = 0;                for(int i = 3; i <= n; i++){                        //当前n步有的跳法            steps = forgStepMinusOne + forgStepMinusTwo;            //为下一次的计算做准备,此次求得是n+1-2步的跳法个数            forgStepMinusTwo = forgStepMinusOne;            //为下一次的计算做准备,此次求得是n+1-1步的跳法个数            forgStepMinusOne = steps;        }                return steps;    }}

测试

总结

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

 

转载于:https://www.cnblogs.com/a294098789/p/5404377.html

你可能感兴趣的文章
让数据库跑的更快的7个MySQL优化建议
查看>>
jquery 取id模糊查询
查看>>
解决在vue中,自用mask模态框出来后,下层的元素依旧可以滑动的问题
查看>>
SSH加固
查看>>
python 二维字典
查看>>
实验吧之【天下武功唯快不破】
查看>>
2019-3-25多线程的同步与互斥(互斥锁、条件变量、读写锁、自旋锁、信号量)...
查看>>
win7-64 mysql的安装
查看>>
dcm4chee 修改默认(0002,0013) ImplementationVersionName
查看>>
maven3在eclipse3.4.2中创建java web项目
查看>>
Building Tablet PC Applications ROB JARRETT
查看>>
Adobe® Reader®.插件开发
查看>>
【POJ 3461】Oulipo
查看>>
Alpha 冲刺 (5/10)
查看>>
使用Siege进行WEB压力测试
查看>>
斑马为什么有条纹?
查看>>
android多层树形结构列表学习笔记
查看>>
Android_去掉EditText控件周围橙色高亮区域
查看>>
《构建之法》第一、二、十六章阅读笔记
查看>>
Git Stash用法
查看>>