在clojure中创建重叠向量

时间:2011-06-19 06:02:22

标签: clojure

给定几个向量,创建由一个元素重叠的新向量的最佳方法是什么?

例如,给定这些向量:

[1 1 1] [2 2 2] [3 3 3]

得到的重叠向量将是:

[1 1 1 2]
      [1 2 2 2 3]
              [2 3 3 3]

2 个答案:

答案 0 :(得分:2)

我的策略是:

  • 创建三个向量序列,每个向量偏移一个(向前和向后)
  • 映射这三个序列,将前一个和后一个向量的最后一个和第一个元素与所有当前向量连接起来

由于需要处理开始和结束条件,代码有点复杂,但您可以使用以下内容执行此操作:

  (def vectors [[1 1 1] [2 2 2] [3 3 3]])

  (map 
     #(concat 
        (if (last %1) [(last %1)] []) 
        %2 
        (if (first %3) [(first %3)] []))
     (cons nil (butlast vectors)) 
     vectors 
     (concat (rest vectors) [nil]))

   => ((1 1 1 2) (1 2 2 2 3) (2 3 3 3))

答案 1 :(得分:1)

递归实现:

(defn overlap [colls]
  (loop [ret [] prefix [] x (first colls) colls (next colls)]
    (if colls
      (recur (conj ret (concat prefix x [(ffirst colls)])) [(last x)] (first colls) (next colls))
      (conj ret (concat prefix x)))))