【发布时间】:2018-07-07 14:31:08
【问题描述】:
如果我想创建一个迭代惰性斐波那契数列,我可以使用 Python:
def fib():
a = 1
b = 2
yield a
yield b
while True:
yield a + b
tmp = a
a = b
b = tmp + b
抓取next(fib) 将通过简单地添加前两个元素为我提供序列中的下一个元素,因此如果我想获得前 1000 个斐波那契元素,我可以快速完成:
fib = fib()
for i in range(0,1000):
print(next(fib))
If I try to reproduce that in Ruby with an Enumerator,它很快就窒息了,每次我们调用 fib.next() 时都会重新计算整个序列:
def fib()
Enumerator.new do |yielder|
yielder << 1 << 2
fib.lazy.zip(fib.lazy.drop(1)).each do |a,b|
yielder << a + b
end
end
end
我找到了另一个 SO post,关于如何在 Ruby 中使用记忆来修复递归斐波那契,但我很好奇,惰性序列和生成器在 Ruby 中是一回事吗?
【问题讨论】:
-
Enumerator.new的文档展示了如何为斐波那契数创建一个枚举器。
标签: ruby generator lazy-sequences