我想创建一个返回延迟扩展的无限斐波那契数序列的函数。
现在,我可以让我的序列在顶级命名空间中可用,如下所示:
(def fibonacci-numbers
(lazy-cat [0 1] (map + fibonacci-numbers (rest fibonacci-numbers))))
然而,这意味着如果我开始大量使用它们,我就会失去对垃圾收集的控制。
我想做类似的事情:
(defn fibonacci-numbers-fn []
(lazy-cat [0 1] (map + (fibonacci-numbers-fn) (rest (fibonacci-numbers-fn)))))
这显然行不通,因为我最终会创建 O(2^n) 序列。我想我在问如何在函数本地命名空间中创建一个自引用的惰性序列。我应该怎么办?
编辑:虽然我喜欢 amalloy 发布的流行解决方案并在整个互联网上找到defn fibs [] (map first (iterate (fn [[a b]] [b (+ a b)]) [0 1])))
,但我对类似于规范 Haskell 方式的版本感兴趣:
fibonaccis = 0 : 1 : zipWith (+) fibonaccis (tail fibonaccis)
这就是我试图用我的原始功能来完成的。对我来说,map-iterate 解决方案读起来像“添加前两个元素以创建一个新元素”,而lazy-cat 解决方案读起来像“加入具有第一个滞后的流”。如何在没有顶级命名空间中的序列的情况下“加入具有第一个滞后的流”?