2017-09-16 98 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