# 首先我们直接看一个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. openstack核心组件--keystone(1)

    一.keystone介绍 keystone 是OpenStack的组件之一,用于为OpenStack家族中的其它组件成员提供统一的认证服务,包括身份验证.令牌的发放和校验.服务列表.用户权限的定义等等 ...

  2. Windows 2012 英文版系统安装中文语言包及时间格式设置

    1.安装中文语言包:在运行窗口中输入"LPKSetup.exe",选择中文语言包安装.--------------------------------------------- 2 ...

  3. IntelliJ IDEA 2018.2激活

    IntelliJ IDEA 2018.2激活 下载补丁 下载补丁JetbrainsIdesCrack-4.2.jar 下载链接 修改文件 将文件JetbrainsIdesCrack-4.2.jar放在 ...

  4. windows使用放大镜快速放大屏幕局部

    Win10系统自带放大镜有时真的是比较难使用的,但是如果你对他的快捷键有所了解之后就会感觉它其实也没有那么难,用户可以在使用完之后直接按快捷键将其关闭,一起看看吧. Win10系统放大镜快速关闭快捷键 ...

  5. Docker管理面板-URLOS(易用、高效、强大)

    一.介绍 URLOS是一个Docker管理面板,它把服务器端软件应用的安装行为简化到极致,堪称服务器端的应用宝,具有集群管理.自动故障转移.自动负载均衡等高级功能,可轻易搭建7*24小时在线的网站运行 ...

  6. Java程序员的职业发展道路 附:大型网站 -- 架构技能图谱(Java版)

    职业发展道路基本有3条: 第一条路线(技术专精): 初级Java开发---中级--高级---项目主管--Java项目经理---网站架构师----资深专家 第二条路线(技术转产品):初级Java开发-- ...

  7. 让mysql的id字段变成表的主键

    1.#已经加主键 desc szdj.sys_message_user;alter table sys_message_user add constraint pk_mess_user primary ...

  8. Linux 防火墙开放特定端口 (iptables)

    1.查看状态:iptables -L -n2.直接编辑:vi /etc/sysconfig/iptables3.端口开放:-A INPUT -m state --state NEW -m tcp -p ...

  9. Laravel-Admin图片上传时的问题

    关于laravel-admin进入有图片上传页面时,会提示未配置存储路径等信息.此时需要去配置. 查看config/admin.php里面有 'upload' => [ // Disk in ` ...

  10. pycharm2019最新激活注册码(亲测有效)

    激活码一: 812LFWMRSH-eyJsaWNlbnNlSWQiOiI4MTJMRldNUlNIIiwibGljZW5zZWVOYW1lIjoi5q2j54mIIOaOiOadgyIsImFzc2l ...