如何在PERL中获得所有组合

时间:2015-04-11 03:49:25

标签: perl

假设,我有3个字 - “我”“爱”“perl”。我想要一个包含所有可能组合的数组,即

i  
love  
perl  
i love  
i perl  
love perl  
i love perl 

4 个答案:

答案 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