Domanda

In Clojure, quale sarebbe il modo migliore per avere una finestra scorrevole su un seq (finito, non troppo grande)? Dovrei semplicemente usare drop e take e tenere traccia dell'indice corrente o c'è un modo migliore che mi manca?

È stato utile?

Soluzione

Penso che partizione con il passaggio 1 lo fa:

user=> (partition 3 1 [3 1 4 1 5 9])
((3 1 4) (1 4 1) (4 1 5) (1 5 9))

Altri suggerimenti

Se vuoi operare su Windows, può anche essere conveniente farlo con map:

user=> (def a [3 1 4 1 5 9])
user=> (map (partial apply +) (partition 3 1 a))
(8 6 10 15)
user=> (map + a (next a) (nnext a))
(8 6 10 15)

Non sapevo che partition potesse farlo, quindi l'ho implementato in questo modo

(defn sliding-window [seq length]
  (loop [result ()
         remaining seq]
    (let [chunk (take length remaining)]
      (if (< (count chunk) length)
        (reverse result)
        (recur (cons chunk result) (rest remaining))))))
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top