, :
sub c{my$n=-1+shift;$n?map{my$c=$_;map$c.$_,c($n,@_)}@_:@_}
, ; , (. combinations):
use strict;
use warnings;
sub c {
my $n=-1+shift;
$n ? map{
my $c = $_;
map $c . $_ , c($n ,@_)
} @_
: @_;
}
sub combinations {
my $number = shift;
my @chars = @_;
$number --;
if ($number) {
my @result;
foreach my $char (@chars) {
my @intermediate_list = map { $char . $_ } combinations($number, @chars);
push @result, @intermediate_list;
}
return @result;
}
else {
return @chars;
}
}
print join " ", combinations(2, "A", "B");
print "\n";
print join " ", c(2, "A", "B");
print "\n\n";
print join " ", combinations(3, "A", "B");
print "\n";
print join " ", c(3, "A", "B");
print "\n";
, :
AA AB BA BB
AA AB BA BB
AAA AAB ABA ABB BAA BAB BBA BBB
AAA AAB ABA ABB BAA BAB BBA BBB
, , , !? , , , : , : "" "", . $number 2 ( ), @chars ('A', 'B').
combinations $number 1, if, foreach. $char 'A'. combinations(1, ('A', 'B')). $number , $number 0 " ", ( "A" , "B" ). :
@intermediate_list = map { $char . $_ } ('A', 'B');
map "A" "B" "A" ($ char), @intermediate_list ('AA', 'AB'). foreach $char = B, @intermediate_list ( "BA", "BB" ).
@intermediate_list , @result .
, , , $number = 3, combinations . , , @result, , . .
, , . , , - .
EDIT: . ysth .