如何对这个 clojure 斐波那契生成器进行心智建模?

How to mental model this clojure fibonacci generator?

在 clojure 中遇到了这个有趣的斐波那契生成器实现。自引用部分有点难理解。对心智建模的任何帮助都会非常有用。

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

宏扩展 (lazy-cat [0 1] (map + (rest fib-seq) fib-seq) 导致:

(concat (lazy-seq [0 1]) (lazy-seq (map + (rest fib-seq) fib-seq)))

(map + coll1 coll2) returns 一个新集合,其中第一个列表的第一项添加到第二个列表的第一项,第一个列表的第二项添加到第二个项目第二个列表,依此类推。

user> (map + [1 2 3 4] [1 2 3 4])
(2 4 6 8)

所以我们从0和1开始,然后我们得到fib-seq剩余的第一个(1)到fib-seq的第一个元素(0),这导致1、然后我们再次获取fib-seq的下一个元素,也就是我们刚刚实现的1,将其添加到fib-seq的第二项中(1),从而得到2 , 依此类推。

所以我们懒惰地将[0 1]连接到两个集合移位1后求和的结果:

[0 1] <+ concat>
[1 + 0
 1 + 1
 2 + 1
 3 + 2
 ...]
user> (take 10 fib-seq)
(0 1 1 2 3 5 8 13 21 34)

希望这对您有所帮助。