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
双关语 ()
。
((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
双关语 ()
。