2

この問題にはさまざまな形があります。たとえば、入力 '(1 2 3 4 5 6) が与えられた場合、偶数ペアと奇数ペアの間で値を交換したい場合があります。出力は '(2 1 4 3 6 5) になります。

Haskell では、これはかなり簡単です。

helper [] = []
helper [x] = [x]
helper (x : y : ys) = y : x : helper ys

同じタスクを達成するためにいくつかの Clojure コードを書きましたが、おそらくもっとクリーンな方法があると思います。これを改善する方法について何か提案はありますか?

(defn helper [[x y & ys]]
  (cond
   (nil? x) (list)
   (nil? y) (list x)
   :else (lazy-seq (cons y (cons x (helper ys))))))

理想的には、リストは遅延して消費および生成されます。ありがとう。

4

3 に答える 3

4
(for [[a b] (partition 2 '(1 2 3 4 5 6))
      i [b a]]
  i)

または、haskell バージョンに似たもの:

(defn helper
  ([] (list))
  ([x] (list x))
  ([x y & r] (concat [y x] (apply helper r))))

(apply helper '(1 2 3 4 5 6))
于 2013-07-11T04:23:42.563 に答える
3

これは怠惰な方法の 1 つです。

user=> (mapcat reverse (partition 2 '(1 2 3 4 5 6)))
(2 1 4 3 6 5)
于 2013-07-11T03:23:53.580 に答える