Recursion Clojure递归向后工作吗?

Recursion Clojure递归向后工作吗?,recursion,clojure,Recursion,Clojure,我现在正在进行第四次调查 我当前的解决方案使用递归遍历列表,并将每个元素附加到同一函数的结果末尾: (fn self [x] (if (= x []) x (conj (self (rest x)) (first x)) )) 但当我与[123]竞争时,它给了我(123) 我认为它应该通过递归来做的是: (conj (conj (conj (conj (conj [] 5) 4) 3) 2) 1) 哪个会回来 [5 4 3

我现在正在进行第四次调查

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

(fn self [x] (if (= x []) 
                   x 
             (conj (self (rest x)) (first x))
))
但当我与[123]竞争时,它给了我(123)
我认为它应该通过递归来做的是:

(conj (conj (conj (conj (conj [] 5) 4) 3) 2) 1)
哪个会回来

[5 4 3 2 1]
但恰恰相反,所以我肯定错过了什么。另外,我不明白为什么一个返回一个向量,另一个返回一个列表。

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


虽然我现在明白了原因(效率),但我觉得对于一个行为不同的函数使用相同的名称很奇怪。但是谢谢你的解释,从现在起它可能会继续:)@Willyfrog:这个行为只是简单的“添加”,没有说在哪里(和(doc conj)提到它)。例如,您还可以连接到一个集合:(conj{:a:c}:b)@Willyfrog,您可以使用它来始终附加到前面。conj将添加到向量的结尾或列表的开头。@Willyfrog读取以下内容:以及以下内容:
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=>