はperlfaq4を参照してください:"How do I permute N elements of a list?"
使用リスト:: CPANにPermutorモジュール。リストが実際に配列の場合は、Algorithm :: Permuteモジュール(CPANでも可能)を試してみてください。
use Algorithm::Permute;
my @array = 'a'..'d';
my $p_iterator = Algorithm::Permute->new (\@array);
while (my @perm = $p_iterator->next) {
print "next permutation: (@perm)\n";
}
より速く実行するために、あなたができる:それはXSコードで書かれており、非常に効率的であるのです
use Algorithm::Permute;
my @array = 'a'..'d';
Algorithm::Permute::permute {
print "next permutation: (@array)\n";
} @array;
は、ここで入力の各ライン上のすべての単語のすべての順列を生成し、小さなプログラムです。並び替える()関数の中で具現化アルゴリズムはKnuthのザ・アート・コンピュータのプログラミングの第4巻(まだ未発表)で議論されており、任意のリスト上で動作します:
#!/usr/bin/perl -n
# Fischer-Krause ordered permutation generator
sub permute (&@) {
my $code = shift;
my @idx = 0..$#_;
while ($code->(@_[@idx])) {
my $p = $#idx;
--$p while $idx[$p-1] > $idx[$p];
my $q = $p or return;
push @idx, reverse splice @idx, $p;
++$q while $idx[$p-1] > $idx[$q];
@idx[$p-1,$q][email protected][$q,$p-1];
}
}
permute { print "@_\n" } split;
アルゴリズム::ループモジュールはまた、NextPermuteを提供し、 NextPermuteNumは、重複した値が含まれていても、配列のすべてのユニークな順列を効率的に検索し、インプレースで修正します。そうでなければ、次の置換が返される。
あなたはこのような0..9のすべての順列を列挙することができるようにNextPermuteは、文字列の順序とNextPermuteNum数値順を使用しています:
use Algorithm::Loops qw(NextPermuteNum);
my @list= 0..9;
do { print "@list\n" } while NextPermuteNum @list;
この記事は興味深い記事です。ありがとう! –