• ベストアンサー

組合せの一覧を表示したいのですが

Perl初心者です、よろしくお願いします。 全組合せの一覧を表示したいのですが よい方法はないでしょうか? @A(あ,い,う,え) @B(か,き,く) @C(さ,し,す,せ,そ) とした場合 1|あ か さ 2|い か さ 3|う か さ    ・    ・    ・ というように全組合せの一覧を表示したいのです。 なにかよい方法を教えていただきたいのですが よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

ymmasayanさんがおっしゃられてますけれども、 三重ループにするのが簡単だと思います。 foreach $c (@C){   foreach $b (@B){     foreach(@A){       print "$_ $b $c\n";     }   } } また、先頭に~~番目とつける必要があれば、 $loop=0; foreach $c (@C){   foreach $b (@B){     foreach(@A){       $loop++;       print "$loop: $_ $b $c\n";     }   } } としてやればいいかと。

すると、全ての回答が全文表示されます。

その他の回答 (2)

  • leaz024
  • ベストアンサー率75% (398/526)
回答No.2

それぞれの配列から1つずつ要素を取り出し組み合わせるのですから、次に何番目を取り出すのかを“配列ごと”に覚えておかなければなりません。 そのためには、配列数分のカウンタを用意すればよいですね。 管理や更新がラクなので、カウンタも配列にします。 後は表示してはカウンタ更新を繰り返せば、目的の動作が実現できるでしょう。 文章だけでは分かりにくいと思うので、以下のサンプル(動作確認済み)と合わせて確認して下さい。 my @A = qw(あ い う え); my @B = qw(か き く); my @C = qw(さ し す せ そ); print_combi(\@A, \@B, \@C); sub print_combi {   my @refs = @_;   my (@cnt, $index);   LOOP_TOP:   while (1) {     $index++;     print "$index|", join(' ', map {$refs[$_]->[$cnt[$_]]} 0..$#refs), "\n";     for (my $n = 0; $n <= $#refs; $n++) {       if ($#{$refs[$n]} > $cnt[$n]) {         $cnt[$n]++;         redo LOOP_TOP;       } else {         $cnt[$n] = 0;       }     }     last;   } } ※関数print_combiは、配列の個数や、各配列の要素数に関係なく動作します。 ※一部に全角空白を使っているので、コピーして試す場合はタブなどに置換してください。

hirochon
質問者

お礼

とても詳しくありがとうございます。 参考になりました。 またよろしくお願いします。

すると、全ての回答が全文表示されます。
  • ymmasayan
  • ベストアンサー率30% (2593/8599)
回答No.1

この例であれば3重ループで出来ませんか。 1番外がCのループで、その中がB、1番中のループがAです。

hirochon
質問者

お礼

ありがとうございます。 早速やってみます。

すると、全ての回答が全文表示されます。

関連するQ&A