Ответ 1
Я думаю, что раздел с шагом 1 делает это:
user=> (partition 3 1 [3 1 4 1 5 9])
((3 1 4) (1 4 1) (4 1 5) (1 5 9))
В Clojure, какой был бы самый лучший способ иметь скользящее окно над (конечным, не слишком большим) seq? Должен ли я просто использовать drop
и take
и отслеживать текущий индекс или есть лучший способ, которым я не хватает?
Я думаю, что раздел с шагом 1 делает это:
user=> (partition 3 1 [3 1 4 1 5 9])
((3 1 4) (1 4 1) (4 1 5) (1 5 9))
Если вы хотите работать с окнами, это также может быть удобно сделать с помощью карты:
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)
Я не знал, что 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))))))