Java Stream来写算法13——求解斐波那契数列Fibonacci

16 篇文章 0 订阅
16 篇文章 0 订阅

总目录

概述

  • 斐波那契数列(Fibonacci sequence),又称黄金分割数列,是意大利数学家莱昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“ 兔子数列 ”。
  • 数列的前两项分别是0与1,根据前两项内容,以后的数据值都为其前面两项数字之和计算出来的,比如第3项就是0+1=1;第四项1+1=2,第五项1+2=3……以此类推。

Java实现思路

  • 当使用流来生成数列时,这个数列是根本不记得前面生成的数字是什么的,Stream流生成器只会内部保留生成数据的种子,至于这个种子以前生成过什么数字,生成器是根本不关心的
  • 普通Stream生成器,只可以生成线性的,或者有公式可以计算出来的数字,而不是像斐波那契这样无公式,只有根据以前的值生成新值的方式
  • 为解决这个问题,需要回看一下生成数字的规律:第0项+第1项=第2项,第1项+第2项=第3项……。这里可以看到,数列的生成是由一对数字共同运算而得出,比如得知第一对(第0项与第1项)后,就可以轻松计算出第2对(第2项与第3项)
  • 基于上述思考,可以把数列全部两两组成一组,并由一个类来保存

代码

public class FibonacciSequence {
    @Getter
    @Setter
    @ToString
    @AllArgsConstructor
    static class TwinValue {
        private int firstValue;
        private int secondeValue;
    }
    BiFunction<Integer, Integer, TwinValue> biFunctionTwinOdd = TwinValue::new;

    public void getFibonacciSequence() {
        Stream<Integer> integerStream = Stream.iterate(biFunctionTwinOdd.apply(0, 1),
                        to -> {
                            int one = to.getFirstValue() + to.getSecondeValue();
                            int two = to.getSecondeValue() + one;
                            return biFunctionTwinOdd.apply(one, two);
                        })
                .flatMap(twinOdd -> Stream.of(twinOdd.getFirstValue(), twinOdd.getSecondeValue())).limit(30);
        Iterator<Integer> integerIterator = integerStream.iterator();
        while (integerIterator.hasNext()) {
            System.out.printf("%d, ", integerIterator.next());
        }
    }
}

测试代码

class FibonacciSequenceTest {
    @Test
    void show() {
        FibonacciSequence fs = new FibonacciSequence();
        fs.getFibonacciSequence();
    }
}
// 运行结果
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368, 75025, 121393, 196418, 317811, 514229,
  • 这样看来,Fibonacci sequence发散得也非常快

把别人文章中好的方法抄写过来文章链接

public static void fibonacci1() {
    //  生成 整形数组,在通过flatmap 转换成一个集合输出
    Stream.iterate(new Integer[]{0, 1}, t -> new Integer[]{t[0] + t[1], t[0] + t[1] + t[1]}) // 1
            .flatMap(Arrays::stream) // flatMap 数据, 将数组元素转化成stream //2
            .limit(10) // 默认是无线长度,所以要给出限制
            .forEach(System.out::println);
}
private static void fibonacci2() {
    // 通过IntSupplier  和 stream.generate 生成
    IntSupplier is = new IntSupplier() {
        int pre = 0;
        int current = 1;

        @Override
        public int getAsInt() {
            int p = pre;
            int next = pre + current;
            pre = current;
            current = next;
            return p;
        }
    };
    public static void main(String[] args) {
        IntStream.generate(is).limit(10).forEach(System.out::println);
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值