clojure递归联合列表

时间:2015-08-03 14:58:33

标签: recursion clojure functional-programming lisp

((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? 需要帮助来理解这一点。 感谢。

2 个答案:

答案 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)返回的隐式()