我正在尝试理解旋转序列的实现,我在 git hub 中找到的答案如下
(fn [n coll]
(take (count coll) (drop (mod n (count coll)) (cycle coll))))
你能解释一下这里到底发生了什么
吗(take 6 (drop 1 (cycle ["a" "b" "c"])))
("b" "c" "a" "b" "c" "a")
这是如何产生的
来自cycle
的文档:
返回 coll 中项的延迟(无限!(重复序列。
所以在你的例子中:
(cycle ["a" "b" "c"])
;; => ["a" "b" "c" "a" "b" "c" "a" "b" "c" "a" "b" "c" ...]
(朝向无穷大和更远(
要削减无限序列,您必须使用take
它采用序列的第一个n
元素。所以:
(take 6 (cycle ["a" "b" "c"]))
;; => ["a" "b" "c" "a" "b" "c"]
在您的示例中,就在调用take
之前,您使用了省略序列的第一个n
元素的drop
。所以:
(drop 1 (cycle ["a" "b" "c"]))
;; => ["b" "c" "a" "b" "c" "a" "b" "c" "a" "b" "c" ...]
(take 6 (drop 1 (cycle ["a" "b" "c"])))
;; => ["b" "c" "a" "b" "c" "a"]
你可以从"勇敢和真实的Clojure"的这一章中了解更多关于懒惰序列的信息。