2013-05-29 36 views
2

我正在玩懶惰列表,似乎無法弄清楚這一點。 我認爲我可以通過將它作爲一個大的遞歸函數來解決我的問題,這個函數可以完成所有必要的工作,但是我想編寫一個簡單的函數。如何扁平化和懶洋洋地連接列表清單

我會嘗試寫一個簡單的例子,應該翻譯成我的問題很容易:

(defn numbers 
    ([] (numbers 1)) 
    ([n] (cons n (lazy-seq (numbers (inc n)))))) 

(defn repeat-n [n] 
    (take n (repeat n))) 

所以,我們有兩個功能。一個返回一個懶惰的數字序列。另一個返回它的數字參數n次(希望它也是懶惰的;如果不是這樣,編寫一個會很容易)。

我想將repeat-n映射到數字,以便返回懶惰的結果序列。我用lazy-seq,lazy-cat,concat和遞歸函數玩了一下,但是我仍然遇到了問題。

函數應該是這樣的

(lazy-concat-map [f items] ...) 

和(希望)呼叫

的結果
(take 11 (lazy-concat-map repeat-n numbers)) 

12233344445 

任何想法?

回答

4
(take 11 (mapcat #(repeat % %) (range))) 
;=> (1 2 2 3 3 3 4 4 4 4 5) 

功能mapconcat(和組合mapcat),以及repeatrange都是懶惰。

列表理解,for,也懶

(take 11 (apply concat (for [x (range)] (repeat x x)))) 
;=> (1 2 2 3 3 3 4 4 4 4 5) 
+2

注意'for'可以幫助擺脫'適用concat':'(對於[X(範圍)N(重複XX)] n)的' 。 – kotarak