3

フィボナッチ数を計算するコードを書いています。このコードで、フィボナッチ数列の最初の n 個の数を生成できます。

Stream.generate(new Supplier<Long>() {
    private long n1 = 1;
    private long n2 = 2;

    @Override
    public Long get() {
        long fibonacci = n1;
        long n3 = n2 + n1;
        n1 = n2;
        n2 = n3;
        return fibonacci;
    }
}).limit(50).forEach(System.out::println);

このメソッドは、このメソッドに渡された要素の数を保持する をlimit返します。フィボナッチ数がある値に達しStreamた後、 の生成を停止したい。Stream

つまり、1000 未満のすべてのフィボナッチ数をリストしたい場合は、 を使用できませlimitん。フィボナッチ数がいくつあるか分からないからです。

ラムダ式を使用してこれを行う方法はありますか?

4

4 に答える 4

3

イテレータを使用してもかまわない場合は、次のように記述できます。

static LongUnaryOperator factorial = x -> x == 0 ? 1
                                      : x * factorial.applyAsLong(x - 1);

public static void main(String[] args) {
    LongStream ls = LongStream.iterate(0, i -> i + 1).map(factorial);
    OfLong it = ls.iterator();
    long next = 0;
    while ((next = it.nextLong()) <= 1000) System.out.println(next);
}
于 2014-02-08T19:29:20.647 に答える
1

汚い最初のバージョン

        Stream.generate(new Supplier<Long>() {
        private long n1 = 1;
        private long n2 = 2;

        @Override
        public Long get() {
            long fibonacci = n1;
            long n3 = n2 + n1;
            n1 = n2;
            n2 = n3;
            return fibonacci;
        }
    }).limit(50).forEach(x -> {
        if (x < 1000) {
            System.out.println(x);
        }
    });
于 2014-02-08T18:57:50.463 に答える