2014-09-24 96 views
0
(def v [:1 :1 :1 :2 :2 :2 :3 :3]) 
(defn groupFirstElem [[vec & more :as myList]] 
    (split-with (partial = vec) myList) 
) 
;the (groupFirstElem v) yields [(:1 :1 :1) (:2 :2 :2 :3 :3)] 

的想法是使用groupFirstElem函數來獲取這個應用功能遞歸每個元素

[(:1 :1 :1) (:2 :2 :2) (:3 :3)] 

我如何去recursevely調用groupFirstElem,使之適用於每個V的「團體」無必須評估第一個元素兩次。

回答

1

首先,您的具體問題可以通過解決:

(partition-by identity [:1 :1 :1 :2 :2 :2 :3 :3]) 
;; => ((:1 :1 :1) (:2 :2 :2) (:3 :3)) 

回到你的問題;以下將反覆功能的(拼接)結果更換平方的最後一個元素:

(defn iterate-last 
    [f sq] 
    (loop [sq sq] 
    (if (empty? (last sq)) 
     (butlast sq) 
     (recur (concat (butlast sq) (f (last sq))))))) 

一個小小的警告,你要這樣稱呼它:

(iterate-last groupFirstElem [v]) 
;; => ((:1 :1 :1) (:2 :2 :2) (:3 :3)) 
+0

謝謝,我有這是一個類似的想法,但力量知道空嗎?或最後一次,或最後一次 – hidden 2014-09-24 21:03:35