# 首先我们直接看一个demo以及他的结果

public class QQ {

    public static void main(String[] args) throws ParseException {

        // 1,1,2,3,5,8 ...
int n = 50;
Long start = System.currentTimeMillis();
System.out.println(fun(n));
System.out.println("time1 : " + (System.currentTimeMillis() - start)); start = System.currentTimeMillis();
System.out.println(fun2(n));
System.out.println("time2 : " + (System.currentTimeMillis() - start)); start = System.currentTimeMillis();
System.out.println(fun3(n));
System.out.println("time3: " + (System.currentTimeMillis() - start)); } public static long fun(int n) {
if (n <= 2) {
return 1L;
} else {
return fun(n - 1) + fun(n - 2);
} } public static long fun2(int n) {
if (n <= 2) {
return 1L;
} else {
long a = 1, b = 1, c = 0;
for (int i = 3; i <= n; i++) {
c = a + b;
a = b;
b = c;
}
return c;
}
} public static long fun3(int n) {
if (n <= 2) {
return 1L;
} else {
long[] arr = new long[n + 1];
arr[1] = 1;
arr[2] = 1;
for (int i = 3; i <= n; i++) {
arr[i] = arr[i - 1] + arr[i - 2];
}
return arr[n];
}
}
}

# 上面代码的计算结果是:

12586269025
time1 : 46059
12586269025
time2 : 0
12586269025
time3: 0

# 分析:

  - 可以看出使用递归计算需要的时间最长

  - 我们不进行理论的分析,再用一个简单的例子去简要说明一下为什么递归需要的时间这么长

public class QQ {

    private static long count = 0L;

    public static void main(String[] args) throws ParseException {

        // 1,1,2,3,5,8 ...
int n = 50;
Long start = System.currentTimeMillis();
System.out.println(fun(n));
System.out.println("time1 : " + (System.currentTimeMillis() - start));
System.out.println("count: " + count); } public static long fun(int n) {
count++;
if (n <= 2) {
return 1L;
} else {
return fun(n - 1) + fun(n - 2);
} } }

# 上面代码的输出结果是:

12586269025
time1 : 48285
count: 25172538049

# 分析:
  - 可以看出fun这个函数被调用了很多次,但是这个函数基本上只有一个逻辑,我们来看看这个比较逻辑调用 25172538049 次会发生些什么吧

public class QQ {

    public static void main(String[] args) throws ParseException {

        // 1,1,2,3,5,8 ...
int n = 50;
Long start = System.currentTimeMillis();
for (long i = 0; i < 25172538049L; i++) { }
System.out.println("time1 : " + (System.currentTimeMillis() - start));
}
}

# 上面代码的输出结果为:
time1 : 10358

# 分析:

  - 上面的代码循环中一共包含两个调用次数较多的逻辑;第一个是比较逻辑,第二个是 自增 逻辑, 可以看出,两个很简单的逻辑调用 25172538049 次就会耗时这么多,那么递归调用加上调用函数的各种开销,一共需要这么长的时间好像也就不足为奇了

斐波那契数列 Java 不同的实现方法所需要的时间比较的更多相关文章

  1. 斐波那契数列-java编程:三种方法实现斐波那契数列

    题目要求:编写程序在控制台输出斐波那契数列前20项,每输出5个数换行 斐波那契数列指的是这样一个数列:1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, … 这个数列 ...

  2. 斐波那契数列—java实现

    最近在面试的时候被问到了斐波那契数列,而且有不同的实现方式,就在这里记录一下. 定义 斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...

  3. 斐波那契数列—Java

    斐波那契数列想必大家都知道吧,如果不知道的话,我就再啰嗦一遍, 斐波那契数列为:1 2 3 5 8 13 ...,也就是除了第一项和第二项为1以外,对于第N项,有f(N)=f(N-1)+f(N-2). ...

  4. 剑指offer【07】- 斐波那契数列(java)

    题目:斐波那契数列 考点:递归和循环 题目描述:大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0),n<=39. 法一:递归法,不过递归比较慢, ...

  5. 斐波那契数列-java实现

    1,1,2,3,5,8,13,21...... 以上的数列叫斐波那契数列,今天的面试第一题,输出前50个,这里记录下. 方式一 package com.geenk.demo.my; /** * @au ...

  6. 07.斐波那契数列 Java

    题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0). n<=39 思路 递归 若n<=2;返回n; 否则,返回Fibonacci ...

  7. 《剑指offer》面试题9 斐波那契数列 Java版

    书中方法一:递归,这种方法效率不高,因为可能会有很多重复计算. public long calculate(int n){ if(n<=0){ return 0; } if(n == 1){ r ...

  8. 用HashMap优化斐波那契数列 java算法

    斐波那契是第一项为0,第二项为1,以后每一项是前面两项的和的数列. 源码:Fibonacci.java public class Fibonacci{ private static int times ...

  9. 斐波那契数列(Java实现)

    描述 一个斐波那契序列,F(0) = 0, F(1) = 1, F(n) = F(n-1) + F(n-2) (n>=2),根据n的值,计算斐波那契数F(n),其中0≤n≤1000. 输入 输入 ...

随机推荐

  1. SAS数据挖掘实战篇【四】

    SAS数据挖掘实战篇[四] 今天主要是介绍一下SAS的聚类案例,希望大家都动手做一遍,很多问题只有在亲自动手的过程中才会有发现有收获有心得. 1 聚类分析介绍 1.1 基本概念 聚类就是一种寻找数据之 ...

  2. H3C 模拟器 pc与sw直连 开启telnet

    如图所示 1 在pc上添加虚拟网卡,与上一章节的添加方式相同 配置pc的ip地址 10.17.4.3 255.255.252.0 2 sw设置 <sw1>system-view [sw1] ...

  3. Centos6.4安装配置mysql

    大数据开发需要读取关系型数据库内的数据,学习过程中主要使用mysql进行学习,以下记录mysql的安装与配置过程. 1.mysql简介 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司 ...

  4. win10相机打不开,显示错误代码0xA00F4246(0x800706D9)

    有时我们在不知道什么情况下电脑便会变成这个样子,当我们以为是驱动问题的时候,或许我们可以使用下面的办法解决这个问题 方法: 1.WIN键+R打开命令端,输入regedit运行 2.进入 计算机\HKE ...

  5. Pandas使用细则

    本文介绍pandas的使用,总结了我在机器学习过程中常使用到的一些方法等. #pandas学习 import pandas as pd import numpy as np import seabor ...

  6. Windows下的开发辅助神器——Chocolate Package Manager

    Windows下的开发辅助神器——Chocolate Package Manager:https://juejin.im/post/5c6cb3acf265da2dc4537235 Windows上的 ...

  7. sass安装:webpack sass编译失败,node-sass安装失败的终极解决方

    文章来源:sass安装:webpack sass编译失败,node-sass安装失败的终极解决方 sass难言之隐-sass安装的坑 之前花了很多时间折腾node-sass,发现sass老是安装不上 ...

  8. js继承的方式及其优缺点

    js继承方法 前因:ECMAScript不支持接口继承,只支持实现继承 一.原型链 概念:每个构造函数都有一个原型对象,原型对象都包含一个指向构造函数的指针,而实例都包含一个指向原型对象的内部指针,让 ...

  9. docker 使用阿里云免费仓库

    阿里云为开发人员提供了免费的仓库~~ 登录阿里云 ,选择容器镜像服务,当前是2019/08/13 ,之后不知道阿里云控制台菜单会不会调整哈 进入容器镜像服务菜单,创建仓库,需要绑定git仓库 怎么上传 ...

  10. PTA(Basic Level)1032.挖掘机技术哪家强

    为了用事实说明挖掘机技术到底哪家强,PAT 组织了一场挖掘机技能大赛.现请你根据比赛结果统计出技术最强的那个学校. 输入格式: 输入在第 1 行给出不超过 105 的正整数 N,即参赛人数.随后 N ...