第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個の目の順列の完成ともに3次元目のループが終了します。そして、
  2次元目の3巡目のループで

セルの内容 
セル番号 

               h1=1;
               if(a[0]==a[1])h1=0;
  においては、が比較されますが、もちろん異なっているのでif文は実行されず、
  3次元ループが再び再開されます。

セルの内容 
セル番号 

                   h2=1;
                   for(l=0;l<2;l++){
                     if(a[l]==a[2]){
                       h2=0;
                       break;
                     }
                   }
  の1巡目において、が比較されh2は0とされブレーク(強制終了)されて、
  2回目の3次元目ループの2巡目が実施され

セルの内容 
セル番号 

                   h2=1;
                   for(l=0;l<2;l++){
                     if(a[l]==a[2]){
                       h2=0;
                       break;
                     }
                   }
  のおいて、1巡目は、2巡目はの比較がされますが、いずれも内容が違いif文はスルーされてh2は1のままで、

セルの内容 
セル番号 

                   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巡目になり、

セルの内容 
セル番号 

  となりますが、
                   for(l=0;l<2;l++){
                     if(a[l]==a[2]){
                       h2=0;
                       break;
                     }
                   }
  の2巡目において、が比較され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回目の2次元目ループに入り、1巡目から

セルの内容 
セル番号 

  これは、
               h1=1;
               if(a[0]==a[1])h1=0;
  をクリアして、3回目の3次元目ループが始まり、

セルの内容 
セル番号 

                   for(l=0;l<2;l++){
                     if(a[l]==a[2]){
                       h2=0;
                       break;
                     }
                   }
  クリアせず、3回目の3次元ループの2巡目に入り、

セルの内容 
セル番号 

  となりますが、これも
                   for(l=0;l<2;l++){
                     if(a[l]==a[2]){
                       h2=0;
                       break;
                     }
                   }
  をクリアせず、3回目の3次元目ループの3巡目になり、

セルの内容 
セル番号 

 今回は
                  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巡目となり、

セルの内容 
セル番号 

               h1=1;
               if(a[0]==a[1])h1=0;
  をクリアせず、すぐに2回目の2次元目ループは3巡目となり

セルの内容 
セル番号 

               h1=1;
               if(a[0]==a[1])h1=0;
  をクリアして、4回目の3時限目ループが始まり、

セルの内容 
セル番号 

 いきなり、
                  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巡目はそれぞれ

セルの内容 
セル番号 


セルの内容 
セル番号 

  ですが、いずれも
                  for(l=0;l<2;l++){
                     if(a[l]==a[2]){
                       h2=0;
                       break;
                     }
                   }
  をクリアできず、4回目の3次元目ループが終了し、続いて2回目の2次元目ループも終了します。
  そして、1次元目ループの3巡目になり、

セルの内容 
セル番号 

  すぐに、3回目の2次元目ループが始まり、

セルの内容 
セル番号 

               h1=1;
               if(a[0]==a[1])h1=0;
  をクリアして、5回目の3次元ループが実行され、

セルの内容 
セル番号 


セルの内容 
セル番号 

  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とになります。
  次に、

セルの内容 
セル番号 

                  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とになります。
  以下は、

セルの内容 
セル番号 


セルの内容 
セル番号 

  はいずれも条件
                  for(l=0;l<2;l++){
                     if(a[l]==a[2]){
                       h2=0;
                       break;
                     }
                   }
  をクリアせず、3次元ループのすべてが終了します。続いて

セルの内容 
セル番号 

  はいずれも条件
               h1=1;
               if(a[0]==a[1])h1=0;
  をクリアせず、3次元ループのすべてが終了します。

  以上トレースから確かにプログラムは、3次順列を生成してくれることが、確認できました。
はじめての

  次話では、いよいろ自己再帰型プログラムに挑戦します。




第4話へ 第6話へ


025


vc++講義へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ



数学研究室に戻る