我试图理解下面的程序,以在 Clojure 中使用递归查找斐波那契数列。
(defn fib
[x]
(loop [i '(1 0)]
(println i)
(if (= x (count i))
(reverse i)
(recur
(conj i (apply + (take 2 i))))))) // This line is not clear
对于前电话,fib(4)
我得到以下输出,
(1 0)
(1 1 0)
(2 1 1 0)
(0 1 1 2)
根据我的推断,这conj
似乎将 的值添加(apply + (take 2 i))
到i
. 但这不是 的行为conj
。有人可以帮助我了解这究竟是如何工作的吗?
这就是conj
, 对于列表的行为。conj
并不总是添加到最后:
(conj '(1) 2) ; '(2 1)
(conj [1] 2) ; [1 2]
添加元素的位置取决于集合的类型。由于添加到列表的末尾很昂贵,因此conj
改为添加到前面。这是相同的操作(添加到列表),但针对正在使用的集合进行了优化。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句