第15講 関数の再帰的呼び出し
第6話 関数の再帰的呼び出しによる順列作成の解説その3


 の世界において1回目のfor文
        for(i=0;i<n;i++){
              a[g]=i+1;
              h=1;
              if(g>0){
                for(j=0;j<g;j++){
                  if(a[g]==a[j]){
                    h=0;
                    break;
                  }
                }
              }
              if(h==1){
                if(g<n-1){
                  f(g+1);
                }
                else{
                  for(k=0;k<n;k++)w+=a[k].ToString()+L" ";
                    w+=L"\n";
                    s++;
                  }
                }
              }
            }
    が実施されると、
    V(g=2の世界)i=0のとき、
      a[g]=i+1;によって、


となります。このときは、a[2]=a[0](=1)になってしまい、
    if(h==1){
       if(g<n-1){
       f(g+1);
                }
                else{
                  for(k=0;k<n;k++)w+=a[k].ToString()+L" ";
                    w+=L"\n";
                    s++;
                  }
                }
              }
      は実施されません。
      for文の2回目のループで、


となりますが、今度はa[2]=a[1](=2)
になってしまい再びif文
    if(h==1){
       if(g<n-1){
                  f(g+1);
                }
                else{
                  for(k=0;k<n;k++)w+=a[k].ToString()+L" ";
                    w+=L"\n";
                    s++;
                  }
                }
              }
       は行われません。
       そして、for文3回目の履行で、


a[0]=1、a[1]=2、a[2]=3となり、はじめて、
    for(j=0;j<g;j++){
      if(a[g]==a[j]){
         h=0;
                    break;
                  }
                }
       でh=0とはされず、if文
              if(h==1){
                if(g<n-1){
                  f(g+1);
                }
                else{
                  for(k=0;k<n;k++)w+=a[k].ToString()+L" ";
                    w+=L"\n";
                    s++;
                  }
                }
              }
        が実行されることになりますが、g=2のため2<2となってしまい、if文
                if(g<n-1){
                  f(g+1);
                }
        は実施されず、わかりにelse文
                else{
                  for(k=0;k<n;k++)w+=a[k].ToString()+L" ";
                    w+=L"\n";
                    s++;
                  }
                }
        が実行されます。
        そして、はじめて文字型変数wへの代入が行われ、w=1 2 3 改行
        となるのです。つまり、1個目の順列


   が出来上がったのです。
         これで、g=2の世界すなわち


     の世界のループが終了となり、
     g=1の世界すなわち


に戻ります。




  U(g=1の世界)i=2のとき、
    a[g]=i+1;により、


a[1]≠a[0]で
  if(g>0){
    for(j=0;j<g;j++){
      if(a[g]==a[j]){
                   h=0;
                   break;
                 }
               }
              }
    の部分でhは書き換わらず、h=1のままで、if文
              if(h==1){
                if(g<n-1){
                  f(g+1);
                }
                else{
                  for(k=0;k<n;k++)w+=a[k].ToString()+L" ";
                    w+=L"\n";
                    s++;
                  }
                }
              }
    が実行されます。そして、


への2度目の飛翔が行われます。



      V(g=2の世界)i=0のとき、


これは、   
  if(g>0){
    for(j=0;j<g;j++){
      if(a[g]==a[j]){
                   h=0;
                   break;
                 }
               }
              }

        によって、h=0と書き換わり
              if(h==1){
                if(g<n-1){
                  f(g+1);
                }
                else{
                  for(k=0;k<n;k++)w+=a[k].ToString()+L" ";
                    w+=L"\n";
                    s++;
                  }
                }
              }
        が実行されず、
      V(g=2の世界)i=1のとき、


となります。
このときはif文
  if(g>0){
    for(j=0;j<g;j++){
                   if(a[g]==a[j]){
                   h=0;
                   break;
                 }
               }
              }
        によって、hは書き換わることがなく、if文
              if(h==1){
                if(g<n-1){
                  f(g+1);
                }
                else{
                  for(k=0;k<n;k++)w+=a[k].ToString()+L" ";
                    w+=L"\n";
                    s++;
                  }
                }
              }
        が実行されますが、g=2なのでg<n-1は2<2となり、if文が実行されず、
        else文
                else{
                  for(k=0;k<n;k++)w+=a[k].ToString()+L" ";
                    w+=L"\n";
                    s++;
                  }
                }
        の方が行われ、wに2回目の代入が行われw=1 2 3 改行
                                    1 3 2 改行
        こうして2個目の順列


   が出来上がったのです。

続きのトレースは次話で


第11講第6話へ
 第12講第1話へ 第14講第10話へ 第15講第5話へ 第15講第7話へ


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