【问题标题】:Fibonacci numbers, with an one-liner in Java? [duplicate]斐波那契数,在 Java 中使用单线? [复制]
【发布时间】:2019-06-02 12:41:23
【问题描述】:

我想知道如何用最 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;
        }

    }
}

【问题讨论】:

  • “最Java的方式”:普通的Java方式不会尝试在一行中实现它。

标签: java


【解决方案1】:

使用流 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

【讨论】:

  • 你真快:)
  • @michalk 谢谢 :) 我想知道更好的答案
  • 如果限制大于47,则会发生溢出。
  • @EdgarAsatryan 是的,因为斐波那契的第 48 个数字大于 Integer.MAX_VALUE (2,147,483,647),因此整数的位正在“溢出”。将 int 更改为 long 它将适用于 limit > 47
  • @MelihAltıntaş,没错。在答案中将int 更改为long 甚至BigInteger 是合理的。 WDYT?
【解决方案2】:

这是一个递归的“单行”(函数体只有一行使用嵌套三元组):

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

示例驱动程序:

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

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

}

输出:

【讨论】:

    猜你喜欢
    • 2011-09-19
    • 2011-06-23
    • 1970-01-01
    • 2020-04-19
    • 2015-08-30
    • 1970-01-01
    • 2011-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多