Раздвижное окно над сек - PullRequest
       10

Раздвижное окно над сек

13 голосов
/ 15 сентября 2009

В Clojure, что было бы самым хорошим способом иметь скользящее окно над (конечным, не слишком большим) последовательностью? Должен ли я просто использовать drop и take и следить за текущим индексом или есть более приятный способ пропустить?

Ответы [ 3 ]

20 голосов
/ 15 сентября 2009

Я думаю, что раздел с шагом 1 делает это:

user=> (partition 3 1 [3 1 4 1 5 9])
((3 1 4) (1 4 1) (4 1 5) (1 5 9))
3 голосов
/ 16 сентября 2009

Если вы хотите работать с окнами, это также может быть удобно сделать с картой:

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)
0 голосов
/ 18 июня 2019

Я не знал, partition может сделать это, поэтому я реализовал это так

(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))))))
...