【Perl】リストの全ての並び順を取得するアルゴリズムは?


配列要素の逆順並びは reverse で得られますが、全ての並び順を得る方法はあるでしょうか?

@A = qw( a b c 4 );

の場合、以下の全配列を取得したいのです。

abc4
ab4c
acb4
ac4b
a4bc
a4cb
bac4
ba4c
bca4
bc4a
b4ac
b4ca
cab4
ca4b
...
4cba # reverse @A で得られる

4 * 3 * 2 * 1 = 24通り?

配列の要素数は一定ではありません。

回答の条件
  • 1人2回まで
  • 登録:2007/01/18 14:26:49
  • 終了:2007/01/18 17:42:14

ベストアンサー

id:b-wind No.1

b-wind回答回数3344ベストアンサー獲得回数4402007/01/18 14:45:49

ポイント500pt
sub permutation {
  my @array = @_;
  return [] unless @array;
  my @result = ();
  for(my $i=0; $i<@array; $i++ ) {
    my @sub = @array;
    splice @sub,$i,1;
    my @permutation_list = permutation(@sub);
    foreach $permutation ( @permutation_list ) {
      push @result ,[$array[$i],@{$permutation}];
    }
  }
  return @result;
}

my @A = qw/a b c 4/;
my @result = permutation(@A);
foreach my $array ( @result ) {
  print join('',@{$array}),"\n";
}

こんな感じ?

同じ文字が含まれた時の事は考慮してません。

id:radio3

素晴らしい!!

お見事です。ありがとうございました!

2007/01/18 17:41:10
  • id:seamlessbias
    モジュールが使える環境ならこういうものもありますね。

    http://search.cpan.org/~edpratomo/Algorithm-Permute/

この質問への反応(ブックマークコメント)

トラックバック

  • そういうメソッドがあるなんて始めて知ったけど、pythonならもしかして?と思ったらやっぱり。 http://docs.python.org/library/itertools.html#itertools.permutations で、perlはというと http://q.hatena.ne.jp/11690980
「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません