Recursion 如何获得所有布尔值组合的列表?
我想创建以下函数all combs,其行为如示例中所示。为什么我的代码不起作用?你能修好它或给出你自己的代码吗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 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))