2017-09-16 15 views
0

Stream.unfoldを使用して、エリクサーでフィボナッチシーケンスを表示する例を以下に示します。それは{f1, {f2, f1+f2}}だけでなく{f2, f1+f2}f1を提供する必要がないのはなぜElixir Stream.unfold新しい状態を設定する

Stream.unfold({0,1}, fn {f1,f2} -> {f1, {f2, f1+f2}} end) |> Enum.take(15) 

[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377] 

?そのため、著者上記のコードの説明で

は言う:

新しい状態がそう {F1、F2}の初期状態は、{F2、F1の新たな状態となり、シーケンスダウン一方を移動させます+ f2}。 f1{f2, f1 + f2}が展開動作は、次の反復のために必要状態ある間に、消費者にストリームすることによって得られなければならない値であるためだ

答えて

1

。フィボナッチ数を生成するには、状態に2つの値が必要です。

あなたの代わりに自然数を生成していた場合、あなたは2つの整数のタプルを行うことができます:

iex(1)> Stream.unfold(0, fn x -> {x, x + 1} end) |> Enum.take(10) 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
+0

は、以下の部分でとても '、すみません{F1、{F2、F1 + F2}}' - 'f1 = f2(現在の反復の)'と 'f2 = f1 + f2(次の反復のため)'でしょうか? (基本的には入れ子になっています) – kirqe

+1

状態が '{a、b}'の場合、次の状態は '{b、a + b}'であり、現在得られる値は 'a'です。 ( 'a'と' b'は 'f1'と' f2' IMOよりも少し簡単です。) – Dogbert

関連する問題