【问题标题】:How to generate Fibonacci sequence using RxJava 1?如何使用 RxJava 1 生成斐波那契数列?
【发布时间】:2017-08-25 06:18:47
【问题描述】:

斐波那契只是下一个元素依赖于前一个元素的更一般问题的一个方便示例。 https://github.com/ReactiveX/RxJava/wiki/Problem-Solving-Examples-in-RxJava 提供了一些不错的方法,但它们仍然有点老套。 generate() 也是推荐的,但在 RxJava 1 中不可用。

有什么替代方法可以做到这一点?是否有等效于 generate()

【问题讨论】:

  • 为什么要用 RxJava 做这个?你为什么要为你制造这个问题?这看起来不像是现实生活中的问题。
  • 为什么选择 RxJava?因为它没有要管理的状态,我们可以轻松地将此操作发送到后台线程。这是一个真正的问题。如果实现服务器以将新数据从时间戳发送到客户端,我必须在网络请求中包含先前响应的时间戳。这将使下一个请求取决于上一个请求的时间戳。
  • 1.x 中有 SyncOnSubscribe 用于此目的。
  • 对于一般情况下,如果您想知道前一个元素,请使用scan 运算符。
  • @akarnokd 谢谢。这可能就是我想要的。

标签: android rx-java fibonacci


【解决方案1】:
        final int number = 9;
        // [0,] 1, 1, 2, 3, 5, 8, 13, 21, 34
        final Observable<Integer> fibonacci = Observable.just(0).repeat().scan(new Pair<Integer, Integer>(0, 1), new Func2<Pair<Integer, Integer>, Integer, Pair<Integer, Integer>>() {
            @Override
            public Pair<Integer, Integer> call(Pair<Integer, Integer> pair, Integer integer) {
//                Log.d(String.format("pair: %s, int: %s", pair, integer));
                int lhs = pair.getValue();
                int rhs = pair.getKey() + lhs;
                return new Pair<Integer, Integer>(lhs, rhs);
            }
        }).map(new Func1<Pair<Integer, Integer>, Integer>() {
            @Override
            public Integer call(Pair<Integer, Integer> pair) {
//                Log.d(String.format("map: %s", pair));
                return pair.getValue();
            }
        });
        final List<Integer> result = fibonacci.take(number).toList().toBlocking().single();
        Log.d(String.format("%s", result));

【讨论】:

  • 投反对票?我相信它确实回答了“如何使用 RxJava 1 生成斐波那契序列?”的问题。
  • 我没有投反对票,但这是github.com/ReactiveX/RxJava/wiki/… 中的一个例子,我没有要求。
猜你喜欢
  • 1970-01-01
  • 2011-12-18
  • 2015-04-25
  • 2011-08-07
  • 2017-11-13
  • 2018-05-11
  • 2012-04-26
  • 2011-02-20
  • 2013-02-24
相关资源
最近更新 更多