如何在多组的所有组合中测试给定的总和?

时间:2011-10-30 18:00:16

标签: clojure

我正在从4Clojure网站开始Problem 131

我可以添加什么样的“for”语句来组合检查这些集合中的每个项目的子集总和为0?

特别是我在这里有几个问题:

  1. 是否有任何clojure函数需要任意数量的集合?

  2. 如果是这样,我怎样才能生成所有子集并对这些子集求和而不向此代码添加额外的Clojure,或者我错了?

  3. 我需要填写__部分。

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

1 个答案:

答案 0 :(得分: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. 您可以使用combinatorics contrib中的subsets来生成所有子集,然后使用reduce +来生成所有子集 #(map (partial reduce +) (subsets %))

  3. 因此,这个问题可以用这两个函数来解决:

    (defn sums [s] 
      (set (map #(reduce + %) (rest (subsets s)))))
    
    (defn cmp [& sets]
      (not (empty? (apply intersection (map sums sets)))))
    

    我无法从contrib中创建4clojure导入库,因此我将其保留原样。