【发布时间】:2021-09-17 22:57:09
【问题描述】:
首先,我想澄清一下,我知道我所问的问题有类似的问题,但我有一个非常具体的输出案例,我正在尝试复制。
我正在尝试创建一个 Scheme 过程,它允许我获取一个集合并生成一个列表,该列表显示该集合的所有可能子集。
例如,如果我调用:(subsets '(a b c )),我应该得到:'((a b c) (b c) (a c) (c) (a b) (b) (a) ())(具体按此顺序)
这是我目前所拥有的:
(define (subsets givenList)
(if (null? givenList)
(list null)
(let ((rest (subsets (cdr givenList))))
(append rest (map (lambda (x)
(cons (car givenList) x))
rest)))))
我的输出是:(() (c) (b) (b c) (a) (a c) (a b) (a b c)) 但这不是我正在寻找的特定输出。
有什么建议吗?
【问题讨论】:
-
所需订单的逻辑是什么?
-
@Barmar 顺序似乎是:所有包含
c的子集在前,然后是包含b但不是c的子集,然后是包含a但不是b的子集或c。递归地,在c子集中,包含b的那些列在仅包含a的那些之前,并且在那些递归的b子集中,包含a的那些列在不包含a的之前;有一种递归的从右到左的消除规则。