第15講 関数の再帰的呼び出しによる順列の作成
第8話 順列作成プログラムの解説4(遙かなるトレースその3=1個目の順列の生成)
コード再掲
#include<iostream>
using namespace std;
void f1(int g);
void f2();
int n,cn;
int a[20];
int main(){
   cout<<"何次順列を作成させるのかキーボードから入力してください。"<<endl;
   cout<<"次数=";
   scanf("%d",&n);
   cn=0;
   f1(0);
   cout<<"順列が"<<cn<<"個できました。"<<endl;
}
void f1(int g){
   int i,j,h;
   for(i=1;i<n+1;i++){
     a[g]=i;
     h=1;
     if(g>0){
       for(j=0;j<g;j++){
         if(a[g]==a[j]){
           h=0;
           break;
         }
       }
     }
     if(h==1){
       if(g+1<n){
         f1(g+1);
       }
       else{
         cn++;
         f2();
       }
     }
   }
}
void f2(){
   int i;
   for(i=0;i<n;i++){
     cout<<a[i]<<" ";
   }
   cout<<endl;
}

 


3番目の人形の
   for(i=1;i<n+1;i++){
     a[g]=i;
の第1ループによって

となりますが、これは重複検査
     if(g>0){
       for(j=0;j<g;j++){
         if(a[g]==a[j]){
           h=0;
           break;
         }
       }
     }
をクリアできず、ルー部の第2巡目になりますが、

これも重複検査
     if(g>0){
       for(j=0;j<g;j++){
         if(a[g]==a[j]){
           h=0;
           break;
         }
       }
     }

に抵触して、3番目の人形のだ3巡目に入り

となります。これは重複検査
   if(g>0){
       for(j=0;j<g;j++){
         if(a[g]==a[j]){
           h=0;
           break;
         }
       }
     }

をパスしてif文
     if(h==1){
       if(g+1<n){
         f1(g+1);
       }
       else{
         cn++;
         f2();
       }
     }

今回は、g+1=2+1=3なので、g+1<nすなわちg+1<3は偽となるので、
else文の方が実行され、
         cn++;
         f2();

カウントされ表示関数f2が呼び出されて、1個目の順列
入門
がコンソールに表示されます。


第7話へ 第9話へ

戻る

C言語 C++講義第1部へ
VB講義へ
VB講義基礎へ

vc++講義へ第1部へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)