我目前正在经历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]
但这恰恰相反,因此我必须缺少一些东西。另外,我不明白为什么一个返回向量,另一个返回列表。
最佳答案
当您执行(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=>