4

私は現在、4clojure問題 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]

しかし、それは正反対なので、何かが欠けているに違いありません。また、ベクトルを返すものとリストを返すものがある理由がわかりません。

4

1 に答える 1

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=>
于 2012-11-26T23:09:59.723 に答える