Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure 函数返回n个布尔值的所有组合?_Clojure - Fatal编程技术网

Clojure 函数返回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 ]] 我想把数字从

我正在尝试实现一个函数,该函数接受一个数字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转换成二进制格式,并使用
位测试
生成布尔值列表,最后链接所有这些列表。但这在我看来相当笨拙,我想一定有更优雅的解决办法

我不知道使用现有库而不是回答您问题的算法细节是否被视为“作弊”,但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的函数。这是一个非常好的模式,值得记住。我有一种感觉,我会一次又一次地回到这个话题上来。是的,确实很好(尽管我花了一段时间才明白)。谢谢在这里你可以学到很多东西。