java实现斐波那契数列(递归、迭代、流)

简介: java实现斐波那契数列(递归、迭代、流)

斐波那契数列是一组数字,除了第一个和第二个数字外,其他数字都是前两个数字之和:

0,1,1,2,3,5,8,13,21...

第一个斐波那契数的值是0,第四个斐波那契数的值是2。因此,要得到后续数列中任一斐波那契数n的值,可以使用下面的公式:F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*)

一、递归

  //    使用递归
    int fib1(int n) {
        if (n < 2) {
            return n;
        }
        return fib1(n - 1) + fib1(n - 2);
    }
 
    //使用map记录
    static Map<Integer, Integer> memo = new HashMap<>(Map.of(0, 0, 1, 1));
 
    private static int fib2(int n) {
        if (!memo.containsKey(n)) {
            memo.put(n, fib2(n - 1) + fib2(n - 2));
        }
        return memo.get(n);
    }

二、迭代

  //使用迭代
    // 递归是反向求解,而迭代是正向求解。有时递归是解决问题最直观的方法
    // 然而,直观的递归解决方案也会带来巨大的性能成本。请记住,任何可以使用递归解决的问题也可以使用迭代来解决。
    private static int fib3(int n) {
        int last = 0, next = 1;
        for (int i = 0; i < n; i++) {
            int oldLast = last;
            last = next;
            next = oldLast + next;
        }
        return last;
    }

三、流输入全部数列

//    使用流
    private int last=0,next=1;
    public IntStream stream(){
        return IntStream.generate(()->{
        int oldLast = last;
        last = next;
        next = oldLast + next;
        return oldLast;
        });
    }

四、测试

class AlgorithmEssenceApplicationTests {
 
    @Test
//    0,1,1,2,3,5,8,13,21...
    void testFib() {
        System.out.println(fib1(5));
        System.out.println(fib1(10));
        System.out.println("---------");
        System.out.println(fib2(5));
        System.out.println(fib2(10));
        System.out.println("---------");
        System.out.println(fib3(5));
        System.out.println(fib3(10));
        System.out.println("---------");
        new AlgorithmEssenceApplicationTests().stream().limit(5+1).forEachOrdered(System.out::println);
        System.out.println("---------");
       new AlgorithmEssenceApplicationTests().stream().limit(10+1).forEachOrdered(System.out::println);
    }
 
    //    使用递归
    int fib1(int n) {
        if (n < 2) {
            return n;
        }
        return fib1(n - 1) + fib1(n - 2);
    }
 
    //使用map记录
    static Map<Integer, Integer> memo = new HashMap<>(Map.of(0, 0, 1, 1));
 
    private static int fib2(int n) {
        if (!memo.containsKey(n)) {
            memo.put(n, fib2(n - 1) + fib2(n - 2));
        }
        return memo.get(n);
    }
 
    //使用迭代
    // 递归是反向求解,而迭代是正向求解。有时递归是解决问题最直观的方法
    // 然而,直观的递归解决方案也会带来巨大的性能成本。请记住,任何可以使用递归解决的问题也可以使用迭代来解决。
    private static int fib3(int n) {
        int last = 0, next = 1;
        for (int i = 0; i < n; i++) {
            int oldLast = last;
            last = next;
            next = oldLast + next;
        }
        return last;
    }
//    使用流
    private int last=0,next=1;
    public IntStream stream(){
        return IntStream.generate(()->{
        int oldLast = last;
        last = next;
        next = oldLast + next;
        return oldLast;
        });
    }
}
5
55
---------
5
55
---------
5
55
---------
0
1
1
2
3
5
---------
0
1
1
2
3
5
8
13
21
34
55
相关文章
|
3天前
|
Java
java基础(11)函数重载以及函数递归求和
Java支持函数重载,即在同一个类中可以声明多个同名方法,只要它们的参数类型和个数不同。函数重载与修饰符、返回值无关,但与参数的类型、个数、顺序有关。此外,文中还展示了如何使用递归方法`sum`来计算两个数之间的和,递归的终止条件是当第一个参数大于第二个参数时。
14 1
java基础(11)函数重载以及函数递归求和
|
1月前
|
存储 Java 数据处理
如何使用 Java 迭代 HashMap 中的 ArrayList
【8月更文挑战第23天】
42 2
|
2月前
|
算法 Java
java使用递归及迭代方式实现前序遍历 中序遍历 后序遍历 以及实现层序遍历
java使用递归及迭代方式实现前序遍历 中序遍历 后序遍历 以及实现层序遍历
67 7
|
1月前
|
存储 Java 数据处理
|
1月前
|
Java API 微服务
Java微服务架构应对互联网应用的大规模访问与快速迭代挑战
Java微服务架构应对互联网应用的大规模访问与快速迭代挑战,通过将应用分解为小型、自治的服务,增强系统灵活性与可扩展性。本文概览微服务定义及特点,深入剖析服务拆分、注册发现、API网关等核心原理,并介绍Spring Boot、Spring Cloud、Docker与Kubernetes等关键技术实践,助力高效构建稳定、高性能的企业级应用。
28 0
|
1月前
|
存储 算法 Java
LeetCode经典算法题:二叉树遍历(递归遍历+迭代遍历+层序遍历)以及线索二叉树java详解
LeetCode经典算法题:二叉树遍历(递归遍历+迭代遍历+层序遍历)以及线索二叉树java详解
64 0
|
2月前
|
敏捷开发 Java 测试技术
实现Java应用的快速开发与迭代
实现Java应用的快速开发与迭代
|
3月前
|
存储 Java
Java基础手册(标识符 关键字 字面值 变量 数据类型 字符编码 运算符 控制语句 方法及方法重载和递归 面向对象与面向过程)
Java基础手册(标识符 关键字 字面值 变量 数据类型 字符编码 运算符 控制语句 方法及方法重载和递归 面向对象与面向过程)
31 0
|
3月前
|
Java 大数据 程序员
老程序员分享:java递归
老程序员分享:java递归
20 0
|
3月前
|
Java
二分查找-递归(java)
二分查找-递归(java)