题
在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))
其他提示
如果您想在Windows上操作,使用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)
我不知道 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))))))
不隶属于 StackOverflow