java程序员到底该不该了解一点算法(一个简单的递归计算斐波那契数列的案例说明算法对程序的重要性)

为什么说 “算法是程序的灵魂这句话一点也不为过”,请看下面这个简单的案例

 1 package recursion;
 2
 3 import java.util.HashMap;
 4 import java.util.Map;
 5
 6 import org.junit.Test;
 7
 8 /**
 9  * @author: MengXianman
10  * @creationTime: 2017年11月27日 上午9:47:51
11  * @description: 斐波那契数列结合备忘录算法的简单使用
12  */
13 public class MemorandumDemo {
14     //计算方法执行次数
15     private long count;
16     //map集合作为一个备忘录,用来保存已经计算出来的fibo(n)的值
17     private Map<Integer, Long> map = new HashMap<>();
18
19     //方式一:不使用map集合作为备忘录缓存数据
20     public long fibo(Integer n) {
21         count++;
22         if(n == 1 || n == 2){
23             return 1;
24         }else{
25             return fibo(n-1) + fibo(n-2);
26         }
27     }
28     //方式二:使用map集合作为备忘录缓存数据
29     public long fibo2(Integer n) {
30         count++;
31         if(n == 1 || n == 2){
32             return 1;
33         }else{
34             if(!map.containsKey(n)){
35                 map.put(n, fibo2(n-1) + fibo2(n-2));
36             }
37             return map.get(n);
38         }
39     }
40
41     @Test
42     public void test1(){
43         long start = System.currentTimeMillis();
44         long result = fibo(50);
45         long end = System.currentTimeMillis();;
46         System.out.println("计算结果:" + result);
47         System.out.println("耗费时间:" + (end-start) + "毫秒");
48         System.out.println("方法执行次数:"+count);
49         /*测试结果
50          * 计算结果:12586269025
51          * 耗费时间:77318毫秒
52          * 方法执行次数:25172538049
53         */
54     }
55
56     @Test
57     public void test2(){
58         long start = System.currentTimeMillis();
59         long result = fibo2(50);
60         long end = System.currentTimeMillis();;
61         System.out.println("计算结果:" + result);
62         System.out.println("耗费时间:" + (end-start) + "毫秒");
63         System.out.println("方法执行次数:" + count);
64         /*测试结果
65          * 计算结果:12586269025
66          * 耗费时间:0毫秒
67          * 方法执行次数:97
68         */
69     }
70 }
时间: 2024-12-12 21:16:01

java程序员到底该不该了解一点算法(一个简单的递归计算斐波那契数列的案例说明算法对程序的重要性)的相关文章

算法小节(一)——斐波那契数列(java实现)

看到公司的笔试题中有一道题让写斐波那契数列,自己忙里偷闲写了一下 什么是斐波那契数列:斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368这个数列从第二项开始,每一项都等于前两项之和. 特别指出:第0项是0,第1项是第一个1. 注:此时a1=1,a2=1,an=a(n-1)+a(n-2)(n>=3,n∈N*)

用程序员思维、程序设计师思维两种方式写求斐波那契数列的方法。

//用Java实现斐波那契数列(Fibonacci) public class Test { public int f(int n)//n代表第几个数字,程序返回它对应的值 { return n>2?f(n-1)+f(n-2):1;//看似如此优雅的一句程序 } //程序设计师的思维:会重构上面的代码,让他们更易读,推荐!!! public int fibo(final int pos) { final int num; if(pos>2) num = fibo(pos-1)+fibo(pos

java输出斐波那契数列

题目要求:编写程序在控制台输出斐波那契数列前20项,每输出5个数换行 斐波那契数列(Fibonacci sequence),又称黄金分割数列.因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为"兔子数列",指的是这样一个数列:1.1.2.3.5.8.13.21.34.--在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1, F(n)=F(n-1)+F(n-2)(n>=2,n∈N*) //Java编程:三种

用程序猿思维、程序设计师思维两种方式写求斐波那契数列的方法。

//用Java实现斐波那契数列(Fibonacci) public class Test { public int f(int n)//n代表第几个数字.程序返回它相应的值 { return n>2?f(n-1)+f(n-2):1;//看似如此优雅的一句程序 } //程序设计师的思维:会重构上面的代码.让他们更易读.推荐!! ! public int fibo(final int pos) { final int num; if(pos>2) num = fibo(pos-1)+fibo(po

简述java递归与非递归算法,0-100求和,斐波那契数列,八皇后,汉诺塔问题

一:什么是递归算法? 递归算法就是直接或者间接的调用自己的方法,在达到一个条件的时候停止调用(递归出口),所以一定要找准好条件,让递归停止,否则就会是无限进行下去 二:递归程序设计的关键 1:找出调用中所需要的参数 2:返回的结果 3:递归调用结束的条件 三:递归程序注意 1:要有方法中自己调用自己 2:要有分支结构 3:要有结束的条件 四:简单叙述递归函数的优缺点 优点: 1:简洁清晰,实现容易,可读性好 2:在遍历的算法中,递归比循环更为简单 缺点: 1:效率低,使用递归函数是有空间和时间的

计算斐波那契数列的性能对比:Python,Java,Go

??本文采用递归办法来计算斐波那契数列中的第38项,用于对于三种计算机语言的计算性能,这三种语言为:Python,Java,Go. ??我们采用递归法来求解斐波那契数列的第n项f(n),其算法描述如下: function fib(n) if n = 0 return 0 if n = 1 return 1 return fib(n ? 1) + fib(n ? 2) 对于公平起见,我们利用三种程序计算f(38),运行100遍,得到平均耗时,作为性能对比. ??Python程序如下: # -*-

【Java】斐波那契数列(Fibonacci Sequence、兔子数列)的3种计算方法(递归实现、递归值缓存实现、循环实现)

斐波那契数列:0.1.1.2.3.5.8.13………… 他的规律是,第一项是0,第二项是1,第三项开始(含第三项)等于前两项之和. > 递归实现 看到这个规则,第一个想起当然是递归算法去实现了,于是写了以下一段: public class RecursionForFibonacciSequence { public static void main(String[] args) { System.out.println(recursion(10)); } public static double

Java 兔子问题(斐波那契数列)扩展篇

Java兔子问题(斐波那契数列)扩展篇 斐波那契数列指的是这样一个数列 0, 1, 1, 2,3, 5, 8, 13, 21, 34, 55, 89, 144, ...对于这个数列仅仅能说将兔子生产周期第为3月.假设生成周期变成4月这个数列肯定不是这种,或者说兔子还有死亡周期,在这里我是对兔子生产周期没有限定.仅仅要月份大于生产周期都能够计算出第month月份究竟能产生多少对兔子. Java兔子生殖问题 斐波那契数列又因数学家列昂纳多·斐波那契以兔子生殖为样例而引入.故又称为"兔子数列"

Java实现斐波那契数列Fibonacci

import java.util.Scanner; public class Fibonacci { public static void main(String[] args) { // TODO Auto-generated method stub Scanner in=new Scanner(System.in); System.out.println("斐波那契数列的个数是:"); int total=in.nextInt(); System.out.println("