我想从数组中的元素中做出所有可能的组合,我不知道如何做到这一点,只是有点聪明。
我的数组看起来像这样:
@array =('a','b','c','d','e','f');
我希望得到这样的输出:
a
ab
abc
abcd
abcde
abcdef
abcdf
abce
abcef
...
etc
所有组合,没有重叠(例如ab和ba)。并且具有1-6的任意数量的元素。订单无关紧要
答案 0 :(得分:3)
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::Loops的NestedLoops
。
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");
}