2016-07-02 28 views
1

說我有載體列表記錄位置Clojure中,總結向量的列表,一路上

([0 0] [1 0] [1 0] [1 0]) 

我希望能在沿途爲您矢量者名單,並記錄每一個獨特的位置。

   [0 0] 
[0 0] + [1 0] = [1 0] 
[1 0] + [1 0] = [2 0] 
[2 0] + [1 0] = [3 0] 

給出4個獨特的位置。

([0 0] [1 0] [2 0] [3 0]) 

任何想法如何在Clojure中實現這一點?

我嘗試下面的代碼,但它爲溢出的大量矢量:(

(defn add-vectors [vectors] 
    (let [[a b] vectors] 
    (vec(map + a b)))) 

(defn get-positions [dirs positions] 
    (if (empty? (rest dirs)) 
    (set positions) 
    (do 
     (let [next-pos (add-vectors (take 2 dirs))] 
     (get-directions (conj (rest (rest dirs)) next-pos) (conj positions next-pos)))))) 

(conj (rest (rest dirs))替換第一個元素在接下來的遞歸調用與來自前兩個向量的總和。最後一次通話

回答

6

要添加兩個數字放在一起,你可以使用+功能,如你所知:

(+ 2 1) 
;;=> 3 

要添加兩個矢量一起,可以使用mapv函數使用+到兩個矢量拉鍊一起:

(mapv + [1 0] [1 0]) 
;;=> [2 0] 

要執行跨向量的序列本矢量相加的左摺疊,則可以使用reduce

(reduce #(mapv + %1 %2) [[0 0] [1 0] [1 0] [1 0]]) 
;;=> [3 0] 

或者更換該函數字面的partial用法:

(reduce (partial mapv +) [[0 0] [1 0] [1 0] [1 0]]) 
;;=> [3 0] 

要獲得此左摺疊的所有中間步驟,你可以使用reductions

(reductions (partial mapv +) [[0 0] [1 0] [1 0] [1 0]]) 
;;=> ([0 0] [1 0] [2 0] [3 0]) 

最後,從這個序列只返回獨特的元素,你可以使用set

(set (reductions (partial mapv +) [[0 0] [1 0] [1 0] [1 0]])) 
;;=> #{[0 0] [1 0] [3 0] [2 0]} 
+0

謝謝你非常有雄辯的迴應!對於想要掌握Clojure基礎知識的人來說,這意味着很多 –