假设,我有3个字 - “我”“爱”“perl”。我想要一个包含所有可能组合的数组,即
i
love
perl
i love
i perl
love perl
i love perl
答案 0 :(得分:4)
假设单词在@words中,结果应该是数组数组:
my @words = qw(i love perl);
my @results = ();
for my $word (@words) {
push @results, map [@$_, $word], @results, [];
}
print "@$_\n" for @results;
这会发出以下内容:
i
i love
love
i perl
i love perl
love perl
perl
每次通过外循环,都会添加新结果,其中一个单词被添加到现有结果中。
要按照您指定的顺序打印它们,您可以按每个结果中的元素数量进行排序:
print "@$_\n" for sort { @$a <=> @$b } @results;
答案 1 :(得分:1)
这称为&#34;幂集&#34;:集合中所有子集的集合。几乎:电源设置包括空集,您可以在需求中将其排除。
Rosetta Code网站a page致力于计算多种编程语言中的功能集,包括Perl中的三种不同解决方案。
单词&#34;组合&#34;通常表示一组特定大小的子集。例如&#34;从52&#34;的牌组中选择的三张牌的组合。功率组由所有尺寸(包括空)的组合构成。
答案 2 :(得分:0)
您可以将其视为有三个标记,您可以在0和1之间切换。当该标志为真时,该字出现在输出中。
100
010
001
110
101
011
111
如果您不关心订单,
for my $f0 (0,1) {
for my $f1 (0,1) {
for my $f2 (0,1) {
my @f = ( $f0, $f1, $f2 );
my $sentence = join " ", map { $f[$_] ? $words[$_] : () } 0..$#words;
say $sentence if length($sentence);
}}}
如果您想处理任意数量的字词,可以使用NestedLoops
。
use Algorithm::NestedLoops;
my $iter = NestedLoops([ ([0,1])x@words ]);
while (my @f = $iter->()) {
my $sentence = join " ", map { $f[$_] ? $words[$_] : () } 0..$#words;
say $sentence if length($sentence);
}
答案 3 :(得分:0)
让Math::Combinatorics
做繁重的工作:
use strict;
use warnings;
use feature qw(say);
use Math::Combinatorics;
my @words = qw(i love perl);
for my $count (1 .. @words) {
my $comb = Math::Combinatorics->new(count => $count,
data => [@words]);
while (my @combo = $comb->next_combination) {
say "@combo";
}
}
然后:
$:» perl combo.pl
love
i
perl
perl i
perl love
i love
love i perl