((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? 需要帮助来理解这一点。 感谢。
答案 0 :(得分:1)
来自conj
的文档:
clojure.core /缀
([coll x] [coll x& xs])
缀[OIN]。返回带有xs
的新集合 '添加'。 (conj nil item)返回(item)。 “添加”可以是 根据具体类型发生在不同的“地方”。
函数的终止条件产生nil
,因为测试是时间。所以最深的联合呼吁将是:
(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]
答案 1 :(得分:0)
递归调用扩展为
(conj (conj (conj (conj (conj nil 1) 2) 3) 4) 5)
;(5 4 3 2 1)
由nil
双关语(foo 0)
返回的隐式()
。