2013-11-09 29 views

回答

3

這裏有一個辦法做到這一點:

(defn austin [coll] 
    (lazy-seq 
    (when-let [[x & xs] (seq coll)] 
    (if (= x "A") 
     (let [[bs other] (split-with #(= % "B") xs)] 
     (cons (apply str x bs) (austin other))) 
     (austin xs))))) 

(austin '("C" "B" "A" "B" "B" "A" "A" "B" "C")) ;=> ("ABB" "A" "AB") 

首先,我們使用when-let要麼解構輸入採集到的第一和休息(xxs),或返回nil - 終止遞歸 - 如果coll爲空。

接下來,我們檢查x"A"。如果是,我們使用split-with將其餘項目拆分爲兩個seqs,即任何"B"之一,緊跟其後的是其他所有。然後,我們使用str"A"與我們找到的任何"B"cons組合到一個遞歸延續過程中。

-1

這可能不是最好的解決方案,但這裏是使用clojure.core/for的工作代碼。

(def abc '("C" "B" "A" "B" "B" "A" "A" "B" "C")) 
=> #'user/abc 
(for [i (range (count abc)) 
     :let [a (nth abc i)] 
     :when (= a "A")] 
    (apply str a (for [j (range (inc i) (count abc)) 
        :let [b (nth abc j)] 
        :while (= b "B")] 
       b))) 
=> ("ABB" "A" "AB")