【问题标题】:Using Intstream to generate infinite Fibonacci sequence使用 Intstream 生成无限斐波那契数列
【发布时间】:2018-05-11 06:22:23
【问题描述】:

我在弄清楚如何使用流来生成无限大小的顺序流时遇到了一点问题,该流包含斐波那契数列中的所有数字。

如何打印出无限流?任何建议都有帮助,谢谢。

【问题讨论】:

    标签: java int fibonacci


    【解决方案1】:
    public class Fibonacci {
    
        public static void main(String[] args) {
            IntStream stream = IntStream.generate(new FibonacciSupplier());
            stream.limit(20).forEach(System.out::println);
        }
    
        private static class FibonacciSupplier implements IntSupplier {
    
            int current = 1;
            int previous = 0;
    
            @Override
            public int getAsInt() {
                int result = current;
                current = previous + current;
                previous = result;
                return result;
            }
        }
    }
    

    但是请注意,当您到达第 47 个元素时,此流不能是无限的,该值太大而无法放入正整数。

    【讨论】:

    • 如果我这样做了,你就不会像你问的那样拥有无限流。你只会有 7 个值的流。
    【解决方案2】:

    您可能认为有一种方法可以使用map 操作来生成序列。没有:Java 非终端操作,按照设计,一次只能操作一个元素。这允许它们被转换为具有确定性结果的并行流。

    您最好的选择是生成无限流。这里有几种方法:

    class Fib {
        private int previous = 0;
        private int current = 1;
    
        private int next() {
            int temp = previous + current;
            previous = current;
            current = temp;
            return current;
        }
    
        public IntStream stream() {
            return IntStream.generate(this::next);
        }
    }
    

    用作new Fib().stream()

    你也可以只使用数组来做到这一点:

    IntStream fibStream = Stream.iterate(new int[]{0, 1}, a -> new int[]{a[1], a[0]+a[1]}).mapToInt(a -> a[1])
    // print first 20 fibonacci number
    fibStream.limit(20).forEach(System.out::println);
    

    【讨论】:

      猜你喜欢
      • 2014-05-19
      • 2011-12-18
      • 2015-04-25
      • 2017-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-29
      • 2011-08-07
      相关资源
      最近更新 更多