Clojure 函数返回n个布尔值的所有组合?
我正在尝试实现一个函数,该函数接受一个数字n,并返回一个包含所有可能的n个布尔值组合的布尔值列表。例如Clojure 函数返回n个布尔值的所有组合?,clojure,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 ]] 我想把数字从
(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转换成二进制格式,并使用
位测试
生成布尔值列表,最后链接所有这些列表。但这在我看来相当笨拙,我想一定有更优雅的解决办法 我不知道使用现有库而不是回答您问题的算法细节是否被视为“作弊”,但Clojure contrib有一组常用的组合函数,可用于计算置换:
(require '[clojure.contrib.combinatorics :as comb])
(defn make-bools [n]
(apply comb/cartesian-product (repeat n [true false])))
的也可以正常工作
(let [bools [false true]]
(for [x bools y bools z bools] [x y z]))
如果您仍然在寻找一个递归的、从头开始的解决方案(如果只是为了研究的话),这里有一个实现了一个模式的解决方案,该模式对于通过树结构递归地构建“路径”非常有用:
(let [bools [true false]]
(fn combs [n]
(if (zero? n)
[[]]
(for [smaller (combs (dec n))
b bools]
(cons b smaller)))))
在这种情况下,“树”是虚构的(一系列真/假选择),但同样的技术也适用。尝试一种递归方法:假设您知道如何创建(生成布尔2),您将如何创建(生成布尔3):只需对每个元素预加假和真即可。将其推广到(makebools n)表示为(makebools n-1)并处理(makebools 0),这将导致一个空列表。谢谢,我也想到了递归,但方式不对。我会尝试这种方法。非常感谢!作弊是绝对允许的-回答得好,谢谢。干杯。有一个警告:请注意,此解决方案仅适用于对
笛卡尔积的函数调用中的[true-false],而不适用于[false-true]。。。我刚刚查看了笛卡尔积的源代码,由于它在每次迭代中测试元素的方式,如果序列中的第一个值为false,它将失败。尽管如此,它仍然适用于所有其他东西的组合,所以我不会批评它!对于未来的访问者:现在是clojure.math.combinationals
。只有在编译时知道需要多少布尔值时,这才有效。你不能把这个解转化为n的函数。这是一个非常好的模式,值得记住。我有一种感觉,我会一次又一次地回到这个话题上来。是的,确实很好(尽管我花了一段时间才明白)。谢谢在这里你可以学到很多东西。