函数返回n个布尔值的所有组合?

时间:2012-01-08 12:06:11

标签: clojure

我正在尝试实现一个带有数字n的函数,并返回包含n个布尔值的所有可能组合的布尔列表。例如, (make-bools 3)应该看起来像

[[false false false]
 [false false true ]
 [false true  false]
 [false true  true ]
 [true  false false]
 [true  false true ]
 [true  true  false]
 [true  true  true ]]

我想过将数字从0转换为(2 ^ n) - 1为二进制格式,并使用bit-test制作一个布尔列表,最后链接所有这些列表。但这对我来说似乎很笨拙,我想必须有一个更优雅的解决方案。

3 个答案:

答案 0 :(得分:3)

我不知道使用现有的库是否被视为“作弊”,而不是回答问题的算法细节,但Clojure-contrib有一组常用的组合函数,可用于计算排列:< / p>

(require '[clojure.contrib.combinatorics :as comb])

(defn make-bools [n]
  (apply comb/cartesian-product (repeat n [true false])))

http://richhickey.github.com/clojure-contrib/combinatorics-api.html

答案 1 :(得分:2)

也可以正常使用

(let [bools [false true]] 
   (for [x bools y bools z bools] [x y z]))

答案 2 :(得分:2)

如果您仍在寻找递归的,从头开始的解决方案(如果只是为了研究),那么这里实现的模式通常可用于通过树结构递归构建“路径”:

(let [bools [true false]]
  (fn combs [n]
    (if (zero? n)
      [[]]
      (for [smaller (combs (dec n))
            b bools]
        (cons b smaller)))))

在这种情况下,“树”是虚构的(一系列真/假选择),但适用相同的技术。