(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的每个“组”而不必两次评估第一个元素。
答案 0 :(得分:1)
首先,您可以使用以下方法解决您的具体问题:
(partition-by identity [:1 :1 :1 :2 :2 :2 :3 :3])
;; => ((:1 :1 :1) (:2 :2 :2) (:3 :3))
回到你的问题;以下将使用函数的(拼接)结果重复替换sq的最后一个元素:
(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))