将函数递归地应用于每个元素

时间:2014-09-24 20:28:04

标签: clojure

(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 个答案:

答案 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))