Clojure递归是否可以倒退?

Wil*_*rog 4 recursion clojure

我目前正在经历4clojure 问题23

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

(fn self [x] (if (= x []) 
                   x 
             (conj (self (rest x)) (first x))
))
Run Code Online (Sandbox Code Playgroud)

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

(conj (conj (conj (conj (conj [] 5) 4) 3) 2) 1)
Run Code Online (Sandbox Code Playgroud)

它确实回来了

[5 4 3 2 1]
Run Code Online (Sandbox Code Playgroud)

但事实恰恰相反,所以我必须遗漏一些东西.另外,我不明白为什么返回一个向量而另一个返回一个列表.

Kev*_*vin 6

当你(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=>
Run Code Online (Sandbox Code Playgroud)

  • @Willyfrog:这种行为只是"添加",而不是说(和*(doc conj)*提到它).例如,您也可以*联合*,例如,一组:*(conj#{:a:c}:b)* (2认同)