gpt4 book ai didi

clojure - 函数局部、自引用、惰性斐波那契数列

转载 作者:行者123 更新时间:2023-12-02 15:19:13 25 4
gpt4 key购买 nike

我想创建一个返回斐波那契数列的延迟扩展无限序列的函数。

现在,我可以使我的序列在顶级命名空间中可用,如下所示:

(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 迭代解决方案读起来就像“添加前两个元素以创建一个新元素”,而惰性猫解决方案读起来就像“加入具有第一个滞后的流”。如何在顶级命名空间中没有序列的情况下“加入具有第一个滞后的流”?

最佳答案

(take 10 (map first (iterate (fn [[a b]]
[b (+ a b)])
[0 1])))

;; (0 1 1 2 3 5 8 13 21 34)

或者,如果您决定手动使用惰性序列来完成此操作:

(letfn [(fibs
([]
(fibs 0 1))
([a b]
(lazy-seq
(cons a (fibs b (+ a b))))))]
(take 10 (fibs)))

;; (0 1 1 2 3 5 8 13 21 34)

关于clojure - 函数局部、自引用、惰性斐波那契数列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12589843/

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