続き

sub combination {
my ($r, @data) = @_;
my $n = @data;

my @result;
combinatorial( $n, $r, 0, [], \@data, \@result );

return @result;
}

sub combinatorial {
my ($n, $r, $pos, $combi, $data, $result) = @_;

if ( $r == 0 ) {
push @$result, [ @$combi ];
return;
}

for my $i ( $pos..$n-$r ) {
push @$combi, $data->[$i];
combinatorial( $n, $r-1, ++$pos, $combi, $data, $result );
pop @$combi;
}
}