gpt4 book ai didi

ruby - Ruby 中的惰性斐波那契数列

转载 作者:数据小太阳 更新时间:2023-10-29 08:46:37 25 4
gpt4 key购买 nike

我可以像这样在 Clojure 中写一个懒惰的斐波那契数列:

(def fib (lazy-cat [1 1] (map +' fib (rest fib))))

我正在尝试(未成功)像这样用 Ruby 编写它:

fib = Enumerator.new do |yielder|
yielder << 1 << 1
fib.zip(fib.drop(1)).map do |a,b|
yielder << (a + b)
end
end

在简化的情况下,这是可行的:

fib = Enumerator.new do |yielder|
yielder << 1 << 1
puts "here"
end
puts fib.take(2).inspect
puts fib.drop(1).take(1).inspect

但这不是:

fib = Enumerator.new do |yielder|
yielder << 1 << 1
puts "here"
fib.drop(1)
end
puts fib.take(2).inspect
puts fib.drop(1).take(1).inspect

为什么最后一个例子给我一个 SystemStackError: stack level too deep 错误?

最佳答案

首先,ruby 版本的fib 不等同于clojure 版本。在 clojure 版本中,它是一个函数。

Enumerable#zip , Enumerable#dropEnumerable.take除非您明确指定,否则不会懒惰。如果你不打电话 Enumerable#lazy ,它们返回一个数组(急切地消耗所有项目;导致异常)。

def fib
Enumerator.new do |yielder|
yielder << 1 << 1
fib.lazy.zip(fib.lazy.drop(1)).each do |a,b|
yielder << a + b
end
end
end

fib.take(2)
# => [1, 1]
fib.lazy.drop(1).take(1).to_a # Note: `lazy`, `to_a`.
# => [1]
fib.take(4)
# => [1, 1, 2, 3]

关于ruby - Ruby 中的惰性斐波那契数列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26173159/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com