clojure 递归 conj 列表

clojure recursion conj a list

((fn foo [x] (when (> x 0) (conj (foo (dec x)) x))) 5)

对于这段代码,结果是 [5 4 3 2 1] 为什么不是 [1,2,3,4,5]? 我看到我们从递归 foo 调用的结果中确定了一个值。 因为我认为它应该是 1 2 3 4 5? 需要帮助才能理解这一点。 谢谢

来自 conj 的文档:

clojure.core/conj
([coll x] [coll x & xs])
conj[oin]. Returns a new collection with the xs
'added'. (conj nil item) returns (item). The 'addition' may
happen at different 'places' depending on the concrete type.

您的函数的终止条件为 nil,因为测试是 when。所以最深的 conj 调用将是:

(conj nil 1)
(1) <-- a list

下一个:

(conj (conj nil 1) 2)
(2 1)

因此您的结果将按降序排列,因为 conj 附加在列表的前面。如果你想按升序排列,从一个空向量开始:

((fn foo [x] (if (> x 0) (conj (foo (dec x)) x) [])) 5)
[1 2 3 4 5]

递归调用扩展为

(conj (conj (conj (conj (conj nil 1) 2) 3) 4) 5)
;(5 4 3 2 1)

(foo 0) 返回的隐式 nil 双关语 ()