我讀了很多關於Clojure的文檔(並且需要再次閱讀它),並閱讀了幾篇關於這個Clojure的問題以獲得對該語言的「感覺」。除了elisp中的一些小函數之外,我從來沒有用過任何Lisp語言編寫過。我在Clojure編寫了我的第一個項目Euler解決方案,在進一步深入之前,我想更好地瞭解一下地圖和減少。什麼在使用地圖時返回一個集合
使用Lambda,我結束了以下(總結3或5或同時1和1000(含)之間的所有倍數):
(reduce + (map #(if (or (= 0 (mod %1 3)) (= 0 (mod %1 5))) %1 0) (range 1 1000)))
我把它放在同一行,因爲我寫的在REPL上(它給出了正確的解決方案)。
沒有拉姆達,我寫了這個:
(defn val [x] (if (or (= 0 (mod x 3)) (= 0 (mod x 5))) x 0))
然後我計算解決方案這樣做:
(reduce + (map val (range 1 1000)))
在這兩種情況下,我的問題是關於地圖做之前應該返回什麼, 減少。在做完地圖後,我注意到我最後列出了一個如下所示的列表:(0 0 3 0 5 6 ...)。
我試圖在VAL定義的末尾去除「0」但我接收由列表(零零零3 5 6等)。我不知道無是否有問題。無論如何,我發現我會在做一個摺疊的時候總結一下,所以零不是真正的問題。
但仍然:什麼是一個合理的地圖返回? (0 0 3 0 5 6 ...)或(無零3無5 6 ...)或(3 5 6 ...)(我將如何處理這最後一個?)或其他?
我應該「過濾」零點/零點,如果是的話如何?
我知道我在問一個基本問題,但map/reduce顯然是我會用的很多,所以任何幫助都是值得歡迎的。
+1 ......我不知道直觀:)我只是想多讀文檔,盡我所能,但隨後的問題是,我知道我已經忘了幾個事情,我讀:)讓我們回到映射產生的數據,如果我有一個情況,我不希望零(在這種情況下罰款),也不在輸出零?在ouptut集合中「過濾」不需要的元素的常見Clojure方法是什麼?只需使用* filter *? – 2012-04-27 20:43:54
是的,如果發現你自己說,喔,我可以「只使用X」你可能在正確的軌道 – 2012-04-27 20:53:58
@ArthurUlfeldt在何種意義上減少「決定如何處理包括」? – Thumbnail 2014-04-06 09:31:51