在perl中创建所有可能的组合

时间:2014-01-21 10:35:59

标签: arrays perl combinations

我想从数组中的元素中做出所有可能的组合,我不知道如何做到这一点,只是有点聪明。

我的数组看起来像这样:

  

@array =('a','b','c','d','e','f');

我希望得到这样的输出:

a
ab
abc
abcd
abcde
abcdef
abcdf
abce
abcef
...

etc

所有组合,没有重叠(例如ab和ba)。并且具有1-6的任意数量的元素。订单无关紧要

3 个答案:

答案 0 :(得分:3)

请参阅Math::Subsets::List

use Math::Subsets::List;
subsets {say "@_"} qw(a b c);
#
#  a
#  b
#  c
#  a b
#  a c
#  b c
#  a b c 

答案 1 :(得分:1)

Algorithm::Combinatorics模块完全符合您的要求:

Math::Combinatorics模块也是这样做的。

答案 2 :(得分:0)

所以你想要

for my $s0 ($array[0], '') {
   for my $s1 ($array[1], '') {
      for my $s2 ($array[2], '') {
         ...
            print(join('', $s1, $s2, $s3, ...), "\n");
         ...
      }
   }
}

当您想要任意嵌套循环时,请使用Algorithm::LoopsNestedLoops

use Algorithm::Loops qw( NestedLoops );

NestedLoops(
   [ map { $_, "" } @array ],
   sub { print(join('', @_), "\n"); },
);

但您可能会注意到每个循环都有两种状态。二进制!它可以在没有听到的情况下完成。

my $num_bits = @array;
my $last = ~( -1 << $num_bits );
my $high_bit_mask = 1 << ( $num_bits - 1 );

for (my $i = $last; $i--; ) {
   my $s = '';
   my $mask = $high_bit_mask;
   for my $bit_num (0..$num_bits) {
      $s .= $array[$bit_num] if $i & $mask;
      $mask >>= 1;
   }

   print("$s\n");
}