【问题标题】: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 双关语为()

      【讨论】:

        猜你喜欢
        • 2011-03-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-28
        • 1970-01-01
        • 1970-01-01
        • 2014-12-17
        • 2020-01-16
        相关资源
        最近更新 更多