如何对这个 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)
希望这对您有所帮助。
在 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)
希望这对您有所帮助。