Perl 6如何生成列表的所有非空子集?
Perl 6 生成所有非空无序子集的内置方法
当然有啦!Perl 6 里内置的 combinations 方法正好能搞定这个需求,而且用法超简单。
对于你给出的列表:
my @a = 1, 2, 3;
只需要调用 combinations 并指定要生成的子集长度范围(从1到列表的元素个数),就能直接得到所有非空子集:
my @non-empty-subsets = @a.combinations(1..@a.elems); say @non-empty-subsets;
运行这段代码,输出结果就是你想要的:
((1), (2), (3), (1 2), (1 3), (2 3), (1 2 3))
补充说明:
combinations方法默认不带参数时,会返回包括空集在内的所有子集。所以我们通过1..@a.elems限定只生成长度为1到3的子集,就自动排除了空集。- 这个方法生成的子集是无序的(不会出现像
(2,1)这种和(1,2)重复的情况),因为它是基于原列表的元素顺序进行组合选择,每个唯一的元素组合只会出现一次,完全符合你对“子集无序”的要求。 - 如果需要将子集转换成集合类型(比如
Set),可以简单处理:@non-empty-subsets.map(*.Set),不过从你的示例来看,列表形式已经满足需求啦。
内容的提问来源于stack exchange,提问作者Eugene Barsky
相关产品推荐
相关产品推荐

