斐波那契数,在Java中只有一线?

时间:2019-06-02 12:41:23

标签: java

我想知道如何用单行的大多数Javatic方法找到第n个斐波那契数。这是我的代码,但是我想学习更好的方法。

class FibonacciExample1 {
    public static void main(String[] args) {
        int n1 = 0, n2 = 1, n3, i, count = 10;
        System.out.print(n1 + " " + n2);//printing 0 and 1    

        for (i = 2; i < count; ++i)//loop starts from 2 because 0 and 1 are already printed    
        {
            n3 = n1 + n2;
            System.out.print(" " + n3);
            n1 = n2;
            n2 = n3;
        }

    }
}

2 个答案:

答案 0 :(得分:11)

使用流api,这非常容易

斐波那契数列:0、1、1、2、3、5、8、13、21、34、55 ....前两个数字 系列中的分别是0和1,每个后续数字是前两个数字的和。 斐波那契元组的序列相似;您有一个数字序列及其后继 系列:(0,1),(1,1),(1,2),(2,3),(3,5),(5,8),(8,13),(13,21) ....

iterate需要一个lambda来指定后继元素。在这种情况下 元组(3,5)后继是(5,3 + 5)=(5,8)。下一个是(8,5 + 8)。你看到图案了吗? 给定一个元组,后继是(t [1],t [0] + t [1])。这是以下lambda指定的内容:t-> 新的int [] {t [1],t [0] + t [1]}。通过运行此代码,您将获得(0,1),(1,1),(1、2),(2、3),(3, 5),(5、8),(8、13),(13、21)....请注意,如果您只是想打印普通的斐波那契数列, 您可以使用地图仅提取每个元组的第一个元素:

Stream.iterate(new long[]{0, 1}, t -> new long[]{t[1], t[0] + t[1]})
    .limit(10)
    .map(t -> t[0])
    .forEach(System.out::println);

这是流api:https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html

答案 1 :(得分:0)

这是一个递归的“单行代码”(函数主体使用嵌套三元数仅一行):

zero(bool):                               # @zero(bool)
        mov     eax, edi
        shl     eax, 3
        xor     dil, 1
        movzx   ecx, dil
        lea     eax, [rax + 8*rcx]
        add     eax, -8
        ret

示例驱动程序:

public static long Fibonacci(int termNumber)
{
    return (termNumber == 1) ? 0 : (termNumber == 2) ? 1 : Fibonacci(termNumber - 1) + Fibonacci(termNumber -2);
}

输出:

enter image description here