【发布时间】:2012-09-25 19:32:26
【问题描述】:
我想创建一个函数来返回延迟扩展的无限斐波那契数序列。
现在,我可以像这样在顶级命名空间中提供我的序列:
(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 解决方案读作“加入具有第一个延迟的流”。如何在没有顶级命名空间中的序列的情况下“加入具有第一个滞后的流”?
【问题讨论】:
-
您的
defn需要[]但所以不允许我进行 2 个字符的编辑。(╯°□°)╯︵ ┻━┻
标签: clojure fibonacci local-variables