我想从数组中的元素中创建所有可能的组合,但我不知道如何做到这一点,只是一点点聪明。在perl中创建所有可能的组合
我的数组是这样的:
@array = ('a', 'b', 'c', 'd', 'e', 'f');
,我希望得到的输出是这样的:
a
ab
abc
abcd
abcde
abcdef
abcdf
abce
abcef
...
etc
与所有的组合,没有重叠(例如AB和BA)。并且具有从1-6的任何数目的元素。顺序并不重要
我想从数组中的元素中创建所有可能的组合,但我不知道如何做到这一点,只是一点点聪明。在perl中创建所有可能的组合
我的数组是这样的:
@array = ('a', 'b', 'c', 'd', 'e', 'f');
,我希望得到的输出是这样的:
a
ab
abc
abcd
abcde
abcdef
abcdf
abce
abcef
...
etc
与所有的组合,没有重叠(例如AB和BA)。并且具有从1-6的任何数目的元素。顺序并不重要
Algorithm::Combinatorics模块不正是你想要什么:
Math::Combinatorics模块会了。
我已经看过Math :: Combinatorics。但据我所知,它只产生一个包含所有元素的输出(例如abcdef),而不是abc – user2335015
use Math::Subsets::List;
subsets {say "@_"} qw(a b c);
#
# a
# b
# c
# a b
# a c
# b c
# a b c
对不起,我是一个新手,我需要安装任何东西来使用它吗? – user2335015
我认为用户想要得到问题的算法,不仅要用模块来实现它。 – JackXu
它不是问题,如果它是算法或模块(我不知道如何使用),但我工作的服务器,我不允许安装任何东西。 – user2335015
所以,你要
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");
}
CPAN是你的朋友 – gaussblurinc