【问题标题】:clojure recursion conj a listclojure recursion conj 一个列表
【发布时间】:2015-10-25 18:04:09
【问题描述】:
((fn foo [x] (when (> x 0) (conj (foo (dec x)) x))) 5)
对于这段代码,结果是 [5 4 3 2 1]
为什么不是 [1,2,3,4,5]?
我看到我们从具有值的递归 foo 调用的结果中进行了 conf 。
因为我认为应该是 1 2 3 4 5?
需要帮助来理解这一点。
谢谢。
【问题讨论】:
标签:
recursion
clojure
functional-programming
lisp
【解决方案1】:
来自conj的文档:
clojure.core/conj
([coll x] [coll x & xs])
结合[oin]。返回一个带有 xs
的新集合
'添加'。 (conj nil item) 返回 (item)。 “添加”可能
根据具体类型发生在不同的“地方”。
你的函数的终止条件产生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]
【解决方案2】:
递归调用扩展为
(conj (conj (conj (conj (conj nil 1) 2) 3) 4) 5)
;(5 4 3 2 1)
(foo 0) 返回的隐式 nil 双关语为()。