http://search.cpan.org/perldoc?Math::Combinatorics
書こうと思えば、書けますが、こういうmoduleがあると、やはり使ってしまいます。
#!/usr/local/bin/perl use strict; use Math::Combinatorics; use Data::Dumper; main(); sub main { #階乗 my $ret_factorial = factorial(4); # = 4x3x2x1 print "#### FACTORIAL\n"; print "$ret_factorial\n"; #組み合わせ nCr = n! / ((n-r)!r!) my @pre_combine = qw/1 2 3/; my @ret_combine = combine(2,@pre_combine); #C(3,2) print "#### COMBINE\n"; print Dumper(\@ret_combine); #順列 nPr = = n! / (n-r)! my @pre_permute = qw/1 2 3/; my @ret_permute_1 = permute(@pre_permute); #P(3,3) print "#### PERMUTE 1\n"; print Dumper(\@ret_permute_1); my @ret_permute_2; for my $pre_permute_2 ( combine(2,@pre_permute) ){ my @tmp = permute(@$pre_permute_2); #P(3,2) push(@ret_permute_2,@tmp); } print "#### PERMUTE 2\n"; print Dumper(\@ret_permute_2); }
実行結果 (改行は編集しているので実際の表示とやや異なります)
[endo@colinux tmp]$ ./foo.pl
#### FACTORIAL
24
#### COMBINE
$VAR1 = [
['1','2'],
['1','3'],
['2','3']
];
#### PERMUTE 1
$VAR1 = [
['1','3','2'],
['1','2','3'],
['3','1','2'],
['3','2','1'],
['2','1','3'],
['2','3','1']
];
#### PERMUTE 2
$VAR1 = [
['1','2'],
['2','1'],
['2','3'],
['3','2'],
['3','1'],
['1','3']
];