Recursion 如何获得所有布尔值组合的列表?

Recursion 如何获得所有布尔值组合的列表?,recursion,boolean,scheme,racket,Recursion,Boolean,Scheme,Racket,我想创建以下函数all combs,其行为如示例中所示。为什么我的代码不起作用?你能修好它或给出你自己的代码吗 (all-combs 0) >> '(()) (all-combs 1) >> '((0) (1)) (all-combs 2) >> '((0 0) (0 1) (1 0) (1 1)) (define (all-combs1 n) (cond [(equal? n 0) '(())] [else (append (map (

我想创建以下函数all combs,其行为如示例中所示。为什么我的代码不起作用?你能修好它或给出你自己的代码吗

(all-combs 0)
>> '(())
(all-combs 1)
>> '((0) (1))
(all-combs 2)
>> '((0 0) (0 1) (1 0) (1 1))

(define (all-combs1 n)
  (cond
  [(equal? n 0) '(())]
  [else
    (append (map (lambda (x) (cons 0 x)) (all-combs1 (- 1 n)))
    (map (lambda (x) (cons 1 x)) (all-combs1 (- 1 n))))
 ]))

你很接近。问题是您正在切换分钟结束和子分钟结束<代码>(-12)不会变为
1
小于
2
,而是
-1
(-1 n)
显然不是预期的参数顺序

(定义(所有梳子n)
(如果(零?n)
'(())
(让([其余梳子(全梳子1(-n 1))]))
(附加(图(λ(x)(cons 0 x))梳子的其余部分)
(图(lambda(x)(cons 1 x))梳子的其余部分
我还做了一些额外的非必要更改:

由于您在同一数据集上执行了两次
all-combs1
,因此它在大量数据上的性能将非常差。通过使用
let
绑定并使用结果两次,很容易忽略它

由于您的案例分析只有一个谓词、一个结果和一个备选方案,因此使用
if
而不是
cond
可能更容易阅读


equal?
可以用于任何数据类型,并且对于所有看起来相同的数据类型都是
#t
。对于数字,使用仅用于数值的
eqv?
=
就足够了。当看到
=
类似于
(=ab)
时,您知道
a
b
应该是数字,而
(eqv?ab)
可以是数字、字符或符号。使用更具体的过程可能更快,但报告不需要实现过程
(零?n)
(=n0)
相同,但不需要指定第二个操作数,其强度更清晰

通常,获取某事物的所有组合的方法是应用于可能值列表的n个副本

将函数应用于值的n次重复的方法是使用:

您使用0和1的示例如下:

> (all-combinations 0 '(0 1))
'(())
> (all-combinations 1 '(0 1))
'((0) (1))
> (all-combinations 2 '(0 1))
'((0 0) (0 1) (1 0) (1 1))
> (all-combinations 3 '(0 1))
'((0 0 0) (0 0 1) (0 1 0) (0 1 1) (1 0 0) (1 0 1) (1 1 0) (1 1 1))
> (all-combinations 4 '(0 1))
'((0 0 0 0) (0 0 0 1) (0 0 1 0) (0 0 1 1) (0 1 0 0) (0 1 0 1) (0 1 1 0) (0 1 1 1)
  (1 0 0 0) (1 0 0 1) (1 0 1 0) (1 0 1 1) (1 1 0 0) (1 1 0 1) (1 1 1 0) (1 1 1 1))

它起作用了!我应该说是n-1而不是-1,因为您调用了两次
(all-combs1(-n1))
,所以执行时间增加了一倍。您可以这样更改条件的最后一个分支:
(else(let((lst(all combs(-n1)))(append(map(lambda(x)(cons 0 x))lst)(map(lambda(x)(cons 1 x))lst()()()()()))))
谢谢,我刚刚添加了它并解释了一个值的n次重复;为了清晰起见,我进行了编辑,希望您不介意。:)
> (all-combinations 0 '(0 1))
'(())
> (all-combinations 1 '(0 1))
'((0) (1))
> (all-combinations 2 '(0 1))
'((0 0) (0 1) (1 0) (1 1))
> (all-combinations 3 '(0 1))
'((0 0 0) (0 0 1) (0 1 0) (0 1 1) (1 0 0) (1 0 1) (1 1 0) (1 1 1))
> (all-combinations 4 '(0 1))
'((0 0 0 0) (0 0 0 1) (0 0 1 0) (0 0 1 1) (0 1 0 0) (0 1 0 1) (0 1 1 0) (0 1 1 1)
  (1 0 0 0) (1 0 0 1) (1 0 1 0) (1 0 1 1) (1 1 0 0) (1 1 0 1) (1 1 1 0) (1 1 1 1))