1

私は seq を持っています(2 3 1 4)

私はそれを反復したいのですが、次の要素が小さい場合はいつでも、前の要素が両方の要素を別のシーケンスに置き換えます。'(- 4 1)。

したがって、f('(2 3 1 4)) => (2 (- 3 1) 4) です。どうやって書くの?

基本的 -

1) seq 内の隣接する 2 つの要素に同時にアクセスしたい。2) その時点で新しい seq を編集して返します。3) 新しく返された seq の処理を​​続行します。

上記の3つを一般的に達成するメカニズムは何ですか。(map、reduce の両方で、一度に 1 つの要素にしかアクセスできません。)

4

4 に答える 4

1

あなたの問題を完全に理解したかどうかはわかりませんが、突き刺します。

まず、seq を保持する var を宣言します。

(def myseq '(2 3 1 4))

次に、同じシーケンスをまとめて圧縮できますが、開始点が異なります。そうすれば、前の要素に簡単にアクセスできます。これは seq の seq を返すためmapcat、結果を 1 つのリストに連結するために使用します。

(mapcat
 (fn [prev curr]
   (if (< prev curr)
     [`(~'- ~curr ~prev)]
     [curr]))
 myseq (drop 1 myseq))

;; evaluates to((- 3 2) 1 (- 4 1))

または、2 番目に提案された出力の後にいる場合:

(mapcat
 (fn [prev curr]
   (if (< prev curr)
     [`(~'- ~curr ~prev)]
     []))
 myseq (drop 1 myseq))

;; evaluates to ((- 3 2) (- 4 1))

お役に立てれば。

更新

わかりました、これにより、必要な出力が得られます。

(mapcat
 (fn [prev curr idx]
   (cond
    (< curr prev) [`(~'- ~prev ~curr)]
    (= (+ idx 2) (count myseq)) [curr]
    :else [prev]))
 myseq (drop 1 myseq) (range (count myseq)))

;; evaluates to (2 (- 3 1) 4)

これがあなたの求めているものであることを願っています。

于 2013-04-24T03:10:13.357 に答える