2017-08-25 43 views
1

斐波納契僅僅是一個更普遍問題的簡單例子,下一個元素依賴於前一個元素。 https://github.com/ReactiveX/RxJava/wiki/Problem-Solving-Examples-in-RxJava提供了一些不錯的方法來做到這一點,但他們仍然有點哈克。 generate()也是推薦的,但在RxJava 1中不可用。如何使用RxJava 1生成Fibonacci序列?

有什麼可以做到這一點的替代方法?是否有相當於generate()

+0

爲什麼要用RxJava來做到這一點?你爲什麼想爲你創建這個問題?這看起來不像現實生活中的問題。 –

+0

爲什麼選擇RxJava?因爲它沒有管理狀態,所以我們可以輕鬆地將此操作發送到後臺線程。這是一個真正的問題。如果實現服務器從時間戳發送新數據到客戶端,則必須在網絡請求中包含先前響應的時間戳。這將使下一個請求取決於先前的請求時間戳。 –

+1

1.x中有'SyncOnSubscribe'用於此目的。 – akarnokd

回答

-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)); 
+0

Downvoted?我相信它的確回答了「如何使用RxJava 1生成斐波納契數列?」的問題。 –

+0

我沒有downvote它,但是這是一個例子在https://github.com/ReactiveX/RxJava/wiki/Problem-Solving-Examples-in-RxJava,我沒有要求。 –