2017-09-16 101 views
0

下面是使用Stream.unfold顯示含酏劑的斐波納契序列的示例。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, f1+f2}}f1並不僅僅是{f2, f1+f2}

因爲在上述作者的代碼的解釋說:

新狀態移動一個向下的順序,所以 {F1,F2}的初始狀態變爲{F2,F1的一個新的狀態+ F2}。

回答

1

這是因爲f1是應該由流產生給消費者,同時{f2, f1 + f2}狀態爲下一次迭代的展開操作所需要的價值。生成斐波那契數字需要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