📜  在Java打印斐波那契数列的 3 种不同方法(1)

📅  最后修改于: 2023-12-03 15:23:24.865000             🧑  作者: Mango

在Java打印斐波那契数列的 3 种不同方法

斐波那契数列是一种能够在许多算法问题中被使用的数列。它的前两个数字是1,之后的每个数字都是前两个数字的和。斐波那契数列的前几个数字是:1, 1, 2, 3, 5, 8, 13, ...

在Java中,我们可以使用不同的方法来打印出斐波那契数列。下面是其中的三种方法:

方法一:使用递归

递归是一种基本的算法思想,它被广泛应用于计算机科学中。斐波那契数列是一种递归的数列,因此我们可以使用递归来打印出它的前n项。

public class Fibonacci {

    public static void main(String[] args) {
        int n = 10;
        for (int i = 1; i <= n; i++) {
            System.out.print(fibonacci(i) + " ");
        }
    }

    public static int fibonacci(int n) {
        if (n <= 1) {
            return n;
        }
        return fibonacci(n - 1) + fibonacci(n - 2);
    }
}

在这个程序中,我们定义了一个静态方法fibonacci,它接收一个整数n作为参数,并返回斐波那契数列的第n项。在fibonacci方法中,我们首先判断n是否小于等于1,如果是,则直接返回n。否则,我们递归调用fibonacci方法来计算n-1和n-2的值,并将它们相加来得到斐波那契数列的第n项。

在main方法中,我们使用一个for循环来打印出斐波那契数列的前n项。我们依次调用fibonacci方法来计算每一项的值,并将其打印出来。

方法二:使用循环

递归虽然是一种简单的方法,但是它的效率不高。因为每次递归都会生成新的调用栈,如果递归次数过多,就会导致栈溢出。因此,我们可以使用循环来解决这个问题。

public class Fibonacci {

    public static void main(String[] args) {
        int n = 10;
        int[] fibonacci = new int[n];
        fibonacci[0] = 1;
        fibonacci[1] = 1;
        for (int i = 2; i < n; i++) {
            fibonacci[i] = fibonacci[i - 1] + fibonacci[i - 2];
        }
        for (int i = 0; i < n; i++) {
            System.out.print(fibonacci[i] + " ");
        }
    }
}

在这个程序中,我们定义了一个长度为n的int数组fibonacci,并将第一项和第二项初始化为1。然后,我们使用一个for循环来计算数组中每一项的值。对于数组中的第i项,我们将它设置为前两项的和fibonacci[i] = fibonacci[i - 1] + fibonacci[i - 2]。最后,我们再使用一个for循环来打印出数组中的所有项。

方法三:使用Stream API

在Java 8中,我们可以使用Stream API来处理集合中的数据。使用Stream API,我们可以更加方便地处理斐波那契数列。

import java.util.stream.IntStream;

public class Fibonacci {

    public static void main(String[] args) {
        int n = 10;
        IntStream.iterate(new int[]{1, 1}, t -> new int[]{t[1], t[0] + t[1]})
                .mapToInt(t -> t[0])
                .limit(n)
                .forEach(i -> System.out.print(i + " "));
    }
}

在这个程序中,我们使用IntStream.iterate方法来生成一个无限流。该方法接收一个初始值new int[]{1, 1}和一个Lambda表达式t -> new int[]{t[1], t[0] + t[1]}。该Lambda表达式用来定义无限流中的每一个元素。在Lambda表达式中,我们始终返回一个数组,该数组的第一项是上一个元素的第二项,第二项是上一个元素的两项之和。由于该流是无限的,我们需要使用limit(n)方法来限制流的大小。

然后,我们使用mapToInt方法将数组中的第一项映射为int类型,并使用forEach方法来打印出所有的元素。