如何对Clojure Fibonacci发生器进行心理建模?

时间:2019-06-12 17:16:29

标签: clojure lazy-sequences

在Clojure中使用斐波那契生成器的这种有趣实现实现。有点难以理解的自我参考部分。对心理建模的任何帮助将非常有用。

  backgroundImage: {
    flex: 1,
    resizeMode: 'cover',
    width: Dimensions.get('window').width,
    height: Dimensions.get('window').height
  },

1 个答案:

答案 0 :(得分:2)

宏观展开(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)返回一个新集合,其中第一个列表的第一项添加到第二个列表的第一项,第一个列表的第二项添加到第二个列表的第二项,并且等等。

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(2)的第二项中,该项​​的结果为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)

希望这会有所帮助。