2014-09-24 94 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