我正在处理 Problem 131来自 4Clojure 网站。
我可以添加什么样的“for”语句来组合检查每个集合中总和为 0 的项目子集?
特别是我在这里有几个问题:
是否有任何 clojure 函数可以接受任意数量的集合?
如果是这样,我如何生成所有子集并对这些子集求和而不向此代码添加额外的 Clojure,还是我弄错了?
我需要填写 __ 部分。
(= true (__ #{-1 1 99}
#{-2 2 888}
#{-3 3 7777}))
最佳答案
你指的是集合(而不是 map )?但实际上,这并不重要。
例如,count接受一个参数,但您可以创建接受任意数量参数的匿名函数。
((fn [& args] ( map 计数参数)) #{-1 1 99} #{-2 2 888} #{-3 3 7777})
或
(#( map 计数 %&) #{-1 1 99} #{-2 2 888} #{-3 3 7777})
您可以使用subsets来自
combinatorics
贡献生成所有子集,然后使用+
减少
它们#(map(部分减少+)(子集%))
所以,这个问题可以通过这两个函数来解决:
(defn sums [s]
(set (map #(reduce + %) (rest (subsets s)))))
(defn cmp [& sets]
(not (empty? (apply intersection (map sums sets)))))
我无法从 contrib 中导入 4clojure
库,所以我保持原样。
关于clojure - 如何测试多组所有组合中的给定总和?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7946715/