第9講 関数の再帰的使用
第5話 for文版順列作成の解説その2
#pragma endregion
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^
e) {
int i,j,k,l,h1,h2;
int *a;
long s=0;
dataGridView1->Rows->Clear();
a=(int* )malloc(12);
String^ w=L"";
for(i=1;i<4;i++){
a[0]=i;
for(j=1;j<4;j++){
a[1]=j;
h1=1;
if(a[0]==a[1])h1=0;
if(h1==1){
for(k=1;k<4;k++){
a[2]=k;
h2=1;
for(l=0;l<2;l++){
if(a[l]==a[2]){
h2=0;
break;
}
}
if(h2==1){
dataGridView1->Rows->Add();
for(l=0;l<3;l++){
dataGridView1[l,s]->Value =a[l];
}
s++;
}
}
}
}
}
dataGridView1->Rows->Add();
dataGridView1[12,s+1]->Value =s.ToString();
}
};
}
セルの内容 | 1 | 2 | 3 |
セル番号 | 0 | 1 | 2 |
1個の目の順列の完成ともに3次元目のループが終了します。そして、
2次元目の3巡目のループで
セルの内容 | 1 | 3 | 1 |
セル番号 | 0 | 1 | 2 |
h1=1;
if(a[0]==a[1])h1=0;
においては、1と3が比較されますが、もちろん異なっているのでif文は実行されず、
3次元ループが再び再開されます。
セルの内容 | 1 | 3 | 1 |
セル番号 | 0 | 1 | 2 |
h2=1;
for(l=0;l<2;l++){
if(a[l]==a[2]){
h2=0;
break;
}
}
の1巡目において、1と1が比較されh2は0とされブレーク(強制終了)されて、
2回目の3次元目ループの2巡目が実施され
セルの内容 | 1 | 3 | 2 |
セル番号 | 0 | 1 | 2 |
h2=1;
for(l=0;l<2;l++){
if(a[l]==a[2]){
h2=0;
break;
}
}
のおいて、1巡目は1と2、2巡目は3と2の比較がされますが、いずれも内容が違いif文はスルーされてh2は1のままで、
セルの内容 | 1 | 3 | 2 |
セル番号 | 0 | 1 | 2 |
if(h2==1){
dataGridView1->Rows->Add();
for(l=0;l<3;l++){
dataGridView1[l,s]->Value =a[l];
}
s++;
}
が実施され、2個目の順列がデータグリッドビューに表示され、s++; によって順列総数も2になります。
2回目の3次元目ループも最後の3巡目になり、
セルの内容 | 1 | 3 | 3 |
セル番号 | 0 | 1 | 2 |
となりますが、
for(l=0;l<2;l++){
if(a[l]==a[2]){
h2=0;
break;
}
}
の2巡目において、3と3が比較されh2は0になってしまいます。
したがって、
if(h2==1){
dataGridView1->Rows->Add();
for(l=0;l<3;l++){
dataGridView1[l,s]->Value =a[l];
}
s++;
}
はスルーされて、2回目の3次元ループが終了します。
1回目の2次元ループも終了しますので、
1次元ループの2巡目になり、
セルの内容 | 2 | 3 | 3 |
セル番号 | 0 | 1 | 2 |
そして、すぐに2回目の2次元目ループに入り、1巡目から
セルの内容 | 2 | 1 | 3 |
セル番号 | 0 | 1 | 2 |
これは、
h1=1;
if(a[0]==a[1])h1=0;
をクリアして、3回目の3次元目ループが始まり、
セルの内容 | 2 | 1 | 1 |
セル番号 | 0 | 1 | 2 |
for(l=0;l<2;l++){
if(a[l]==a[2]){
h2=0;
break;
}
}
クリアせず、3回目の3次元ループの2巡目に入り、
セルの内容 | 2 | 1 | 2 |
セル番号 | 0 | 1 | 2 |
となりますが、これも
for(l=0;l<2;l++){
if(a[l]==a[2]){
h2=0;
break;
}
}
をクリアせず、3回目の3次元目ループの3巡目になり、
セルの内容 | 2 | 1 | 3 |
セル番号 | 0 | 1 | 2 |
今回は
for(l=0;l<2;l++){
if(a[l]==a[2]){
h2=0;
break;
}
}
をクリアして、
if(h2==1){
dataGridView1->Rows->Add();
for(l=0;l<3;l++){
dataGridView1[l,s]->Value =a[l];
}
s++;
}
が実施され、3個目の順列がデータグリッドビューに表示され、順列総数も3とカウントされます。
これで3回目の3次元目ループが終了し、
2回目の2次元目ループの2巡目となり、
セルの内容 | 2 | 2 | 3 |
セル番号 | 0 | 1 | 2 |
h1=1;
if(a[0]==a[1])h1=0;
をクリアせず、すぐに2回目の2次元目ループは3巡目となり
セルの内容 | 2 | 3 | 3 |
セル番号 | 0 | 1 | 2 |
h1=1;
if(a[0]==a[1])h1=0;
をクリアして、4回目の3時限目ループが始まり、
セルの内容 | 2 | 3 | 1 |
セル番号 | 0 | 1 | 2 |
いきなり、
for(l=0;l<2;l++){
if(a[l]==a[2]){
h2=0;
break;
}
}
をクリアして、
if(h2==1){
dataGridView1->Rows->Add();
for(l=0;l<3;l++){
dataGridView1[l,s]->Value =a[l];
}
s++;
}
if(h2==1){
dataGridView1->Rows->Add();
for(l=0;l<3;l++){
dataGridView1[l,s]->Value =a[l];
}
s++;
}
が実施され、4個目の順列がデータグリッドビューに表示され、順列総数も4を数えることになります。
2巡目、3巡目はそれぞれ
セルの内容 | 2 | 3 | 2 |
セル番号 | 0 | 1 | 2 |
セルの内容 | 2 | 3 | 3 |
セル番号 | 0 | 1 | 2 |
ですが、いずれも
for(l=0;l<2;l++){
if(a[l]==a[2]){
h2=0;
break;
}
}
をクリアできず、4回目の3次元目ループが終了し、続いて2回目の2次元目ループも終了します。
そして、1次元目ループの3巡目になり、
セルの内容 | 3 | 3 | 2 |
セル番号 | 0 | 1 | 2 |
すぐに、3回目の2次元目ループが始まり、
セルの内容 | 3 | 1 | 2 |
セル番号 | 0 | 1 | 2 |
h1=1;
if(a[0]==a[1])h1=0;
をクリアして、5回目の3次元ループが実行され、
セルの内容 | 3 | 1 | 1 |
セル番号 | 0 | 1 | 2 |
セルの内容 | 3 | 1 | 2 |
セル番号 | 0 | 1 | 2 |
2巡目において
for(l=0;l<2;l++){
if(a[l]==a[2]){
h2=0;
break;
}
}
をクリアして、
if(h2==1){
dataGridView1->Rows->Add();
for(l=0;l<3;l++){
dataGridView1[l,s]->Value =a[l];
}
s++;
}
if(h2==1){
dataGridView1->Rows->Add();
for(l=0;l<3;l++){
dataGridView1[l,s]->Value =a[l];
}
s++;
}
が実施され、5個目の順列がデータグリッドビューに表示され、順列総数5とになります。
次に、
セルの内容 | 3 | 2 | 1 |
セル番号 | 0 | 1 | 2 |
for(l=0;l<2;l++){
if(a[l]==a[2]){
h2=0;
break;
}
}
をクリアして、
if(h2==1){
dataGridView1->Rows->Add();
for(l=0;l<3;l++){
dataGridView1[l,s]->Value =a[l];
}
s++;
}
if(h2==1){
dataGridView1->Rows->Add();
for(l=0;l<3;l++){
dataGridView1[l,s]->Value =a[l];
}
s++;
}
が実施され、6個目の順列がデータグリッドビューに表示され、順列総数6とになります。
以下は、
セルの内容 | 3 | 2 | 2 |
セル番号 | 0 | 1 | 2 |
セルの内容 | 3 | 2 | 3 |
セル番号 | 0 | 1 | 2 |
はいずれも条件
for(l=0;l<2;l++){
if(a[l]==a[2]){
h2=0;
break;
}
}
をクリアせず、3次元ループのすべてが終了します。続いて
セルの内容 | 3 | 3 | 2 |
セル番号 | 0 | 1 | 2 |
はいずれも条件
h1=1;
if(a[0]==a[1])h1=0;
をクリアせず、3次元ループのすべてが終了します。
以上トレースから確かにプログラムは、3次順列を生成してくれることが、確認できました。
次話では、いよいろ自己再帰型プログラムに挑戦します。
第4話へ 第6話へ