# 首先我们直接看一个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. python 类中__init__函数的使用

    class F: def __init__(self): print('hello china') __init__ 是构造函数,初始化类,每当调用类的时候,就会自动执行这个函数 比如:执行 F() ...

  2. Python 安装 for Linux

    make后报错: Failed to build these modules:_multiprocessing   binascii           zlib 下载http://www.zlib. ...

  3. minio 集群启动方法

    Sample: export MINIO_ACCESS_KEY=<TENANT1_ACCESS_KEY> export MINIO_SECRET_KEY=<TENANT1_SECRE ...

  4. Autofac实现AOP拦截

    本文主要是详解一下在ASP.NET Core中,采用替换后的Autofac来实现AOP拦截. Aspect Oriented Programming(AOP),面向切面编程,是一个比较热门的话题.AO ...

  5. SQL常见面试题(学生表_课程表_总表)

    问题描述: 为管理岗位业务培训信息,建立3个表: S (S#,SN,SD,SA) S#,SN,SD,SA 分别代表学号.学员姓名.所属单位.学员年龄 C (C#,CN ) C#,CN 分别代表课程编号 ...

  6. word2010目录和正文分开编页码

    最近公司要写文档,老板给了一个范文模板,其中目录和正文的页码就是分开编辑的.上网查了很多资料,基本上都没有附图,通过自己的摸索以后终于实现了.现在我就把实现过程跟截图一并奉上.

  7. python3.6调用c语言动态编译文件 c语言编译可执行文件和动态编译等

    1.c的代码 dfunc.c #include<stdio.h> int dgfunc(int n) { ){ ; }else{ )+dgfunc(n-); } } 2.动态编译 cmd ...

  8. 【Linux开发】linux设备驱动归纳总结(十一):写个简单的看门狗驱动

    linux设备驱动归纳总结(十一):写个简单的看门狗驱动 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...

  9. DDOS常见攻击类型和防御措施

    DDOS 攻击类型: SYN Flood 攻击 ACK Flood 攻击 UDP Flood 攻击 ICMP Flood 攻击 Connection Flood 攻击 HTTP Get 攻击 UDP ...

  10. Linux动态链接之GOT与PLT

    转载于:http://www.cnblogs.com/xingyun/archive/2011/12/10/2283149.html   我们知道函数名就是一个内存地址,这个地址指向函数的入口.调用函 ...