Clojure 如何迭代集合并在每次迭代中访问上一个、当前和下一个值?

Clojure 如何迭代集合并在每次迭代中访问上一个、当前和下一个值?,clojure,Clojure,如何在Clojure中迭代集合的元素,以便在每次迭代中访问上一个、当前和下一个值 使用以下向量: [1 2 3 4] 我希望在每次迭代中都能访问以下值: [nil 1 2] [1 2 3] [2 3 4] [3 4 nil] 其中一种方法是在收集之前和之后使用tingnil,然后使用步长为1的3个元素对其进行计算 (def c [1 2 3 4]) (def your-fn println) ;; to print some output later (map your-fn (m

如何在Clojure中迭代集合的元素,以便在每次迭代中访问上一个、当前和下一个值

使用以下向量:

[1 2 3 4]
我希望在每次迭代中都能访问以下值:

[nil 1 2]
[1 2 3]
[2 3 4]
[3 4 nil]
其中一种方法是在收集之前和之后使用ting
nil
,然后使用步长为1的3个元素对其进行计算

(def c [1 2 3 4])
(def your-fn println) ;; to print some output later
(map your-fn
     (map vec (partition 3 1 (concat [nil] c [nil]))))
(如果元素是LazySeq而不是向量,也可以删除
map-vec
部分。)

其中打印:

[nil 12]
[1 2 3]
[2 3 4]
[3 4无]


下面是一个利用析构函数的
循环/重现
实现

(let [s [1 2 3 4]]
  (loop [[prev & [cur nxt :as more]] (cons nil s)
         result []]
    (if (seq more)
      (recur more (conj result [prev cur nxt]))
      result)))

我建议使用分区技术,但另一个技巧是在同一序列的交错实例上映射

(let [s [1 2 3 4]]
  (map vector (cons nil s) 
              s
              (concat (drop 1 s) [nil])))

-> ([nil 1 2] [1 2 3] [2 3 4] [3 4 nil])

接受多个参数并将其作为参数传递以进行递归的递归函数?感觉好像我误解了你的问题。@DavidBern你能拿出一个代码样本吗?阅读clojure社区的问题和答案很有教育意义。相比之下,我觉得自己很愚蠢。我想到的解决方案是:(循环[prev nil,[current&next][0,1,2,3,4,5,6,7]](如果(nil?next)current(do(println next)(recurt current next)))当查看Erwin给出的答案时,我很惊讶我还有多少东西要学:)我发现很难理解这一点solution@eliocs一旦你内化了析构函数,这是非常直观的理解,尽管如此,如果你需要一个通用的可重用解决方案,我还是会推荐一个更具功能性的构造,就像其他两个答案一样。我不知道
分区
函数真的很有用!