2011-10-30 82 views
3

我正在致電來自4Clojure網站的Problem 131我怎樣才能測試給定的總和多組的所有組合?

我可以添加什麼樣的「for」語句來組合檢查這些集合中的每個集合,以得到總和爲0的項目子集?

特別是我在這裏的幾個問題:

  1. 是否有任何Clojure的函數,它接受的套任意號碼?

  2. 如果是這樣,我該如何生成所有子集並對這些子集進行求和而無需爲此代碼添加額外的Clojure,或者我誤會了?

我需要填寫__部分。

(= true (__ #{-1 1 99} 
      #{-2 2 888} 
      #{-3 3 7777})) 

回答

4
  1. 你的意思是集(而不是圖)?但實際上,這並不重要。
    例如,count需要一個參數,但您可以創建匿名函數,該函數使用任意數量的參數。
    ((fn [& args] (map count args)) #{-1 1 99} #{-2 2 888} #{-3 3 7777})

    (#(map count %&) #{-1 1 99} #{-2 2 888} #{-3 3 7777})

  2. 您可以使用subsetscombinatorics的contrib生成所有的子集,然後reduce他們+
    #(map (partial reduce +) (subsets %))

所以,這個問題可以用這些來解決兩個功能:

(defn sums [s] 
    (set (map #(reduce + %) (rest (subsets s))))) 

(defn cmp [& sets] 
    (not (empty? (apply intersection (map sums sets))))) 

我無法從contrib中導入4clojure導入庫,因此我將其保留原樣。

+0

有幫助,但這不會回答4clojure問題.....任何其他嘗試? – jayunit100

+2

上面,結合創建一個集合的所有子集的機制,應該足以讓你找出答案。 –

+0

@jayunit100:您可能首先要解決[問題85](http://www.4clojure.com/problem/85)。功率集(減空集)正是另一種機制。 –

相關問題