2

私はClojureを使用していくつかのLispエクササイズに取り組んでいます。私は、ベクトルといくつかのClojure関数を利用せずに、これらの演習を実行しようとしています。

この機能

(defn rev-seq
    [s1]
    (concat (pop s1) (list (peek s1))))

リストの最初の要素を最後に置きます。この関数を(Clojureの関数を呼び出さずに)リストを逆にするのに必要な回数だけ呼び出したいと思いますreverse

その代わりに何を使うべきかわかりません。マップ、適用、繰り返しを試しましたが、成功しませんでした。正直な答えとは違う考え方をしたいのですが、議論は求めていません。

4

2 に答える 2

4

firstまず、一般的なシーケンスで作業したい場合は、 /restではなくpeek/を使用するようにrev-seqを変換する必要があると思いますpop-少なくともClojure 1.4ではpeek/ popPersistentStackが必要なようです:

(defn rev-seq
  [s1]
  (concat (rest s1) (list (first s1))))

次に、この関数を繰り返し適用すると、リストが逆になるのではなく、リストが「循環」することに注意する必要があります。以下を使用した少数のアプリケーションの結果を見ると、次のことがわかりますiterate

(def s '(1 2 3 4 5 6 7 8 9))

(nth (iterate rev-seq s) 3)
=> (4 5 6 7 8 9 1 2 3)

動作するオプションは、再帰関数で逆にすることです。

(defn reverse-seq [s]
  (concat (reverse (next s)) (list (first s))))

(reverse-seq s)
=> (9 8 7 6 5 4 3 2 1)

または、clojure.coreの手法を使用して逆の操作を行うこともできます。

(defn reverse-seq [s]
  (reduce conj () s))

(reverse-seq s)
=> (9 8 7 6 5 4 3 2 1)

これがあなたにいくつかのアイデアを与えることを願っています!

于 2012-10-06T00:45:21.890 に答える
1

再帰は強力です!ソリューション をClojureに翻訳 しました。

(defn- inverte-aux
  [lista resto]
  (if lista
    (recur (next lista) (cons (first lista) resto))
    resto))

(defn inverte
  [lista]
  (inverte-aux lista nil))

user> (inverte [4 3 2 1 3])
(3 1 2 3 4)
于 2012-10-06T06:59:37.800 に答える