【问题标题】:Does Clojure recursion work backwards?Clojure 递归是否向后工作?
【发布时间】:2012-11-26 22:54:25
【问题描述】:

我目前正在使用 4clojure Problem 23

我当前的解决方案使用递归遍历列表并将每个元素附加到同一函数结果的末尾:

(fn self [x] (if (= x []) 
                   x 
             (conj (self (rest x)) (first x))
))

但是当我针对 [1 2 3] 运行它时,它给了我 (1 2 3)
我认为它应该通过递归做的是:

(conj (conj (conj (conj (conj [] 5) 4) 3) 2) 1)

确实返回

[5 4 3 2 1]

但恰恰相反,所以我一定是遗漏了一些东西。另外,我不明白为什么一个返回向量而另一个返回一个列表。

【问题讨论】:

    标签: recursion clojure


    【解决方案1】:

    当您执行 (rest v) 时,您将获得一个列表(不是向量),然后 conj 每次都附加到前面(而不是后面):

    user=> (defn self [v] (if (empty? v) v (conj (self (rest v)) (first v))))
    #'user/self
    user=> (self [1 2 3])
    (1 2 3)
    user=> (defn self [v] (if (empty? v) [] (conj (self (rest v)) (first v))))
    #'user/self
    user=> (self [1 2 3])
    [3 2 1]
    user=>
    user=> (rest [1])
    ()
    user=> (conj '() 2)
    (2)
    user=> (conj '(2) 1)
    (1 2)
    user=>
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-16
    • 2017-05-23
    • 1970-01-01
    • 1970-01-01
    • 2019-03-31
    相关资源
    最近更新 更多