以下是使用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
中提供{f1, {f2, f1+f2}}
,而不仅仅是{f2, f1+f2}
?
因为在上面的代码解释中说:
新状态向下移动一个序列,因此初始状态为 {f1,f2}成为{f2,f1 + f2}的新状态。
答案 0 :(得分:3)
这是因为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]