下面是一个使用Stream.unfold显示fibonacci序列的例子。
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}的新状态。
发布于 2017-09-16 15:42:39
这是因为f1是应该由流生成给使用者的值,而{f2, f1 + f2}是下一次迭代所需的展开操作所需的状态。生成Fibonacci数需要状态中的两个值才能工作。
如果您生成的是自然数,则可以使用两个整数的元组:
iex(1)> Stream.unfold(0, fn x -> {x, x + 1} end) |> Enum.take(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]https://stackoverflow.com/questions/46255524
复制相似问题