第15講 関数の再帰的呼び出し
第4話 関数の再帰的呼び出しによる順列作成の解説その1
お約束の通り、関数の再帰的呼び出しの方法の方の解説をします。簡単に、
#pragma once
int n=3;
int a[3];
int s;
   ・
   ・
   ・
#pragma endregion
      String^ w;
   private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
            w=L"";
            s=0;
            f(0);
            w+=L"\n"+L"順列総数:"+s.ToString();
            label1->Text=w;
         }
         void f(char g){
            int i,j,k,h;
            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++;
                }
              }
            }
          }
 
の方で解説していきます。

最初の3行
int n=3;
int a[3];
int s=0;
ではグローバル変数nとs、グローバル配列aを宣言しています。
これらをグローバルにした理由は、
プログラムを簡単にするためです。
System::Void button1_Clickの中で宣言すると、
関数引数にaのアドレスや順列個数n等を入れなくてはならなくなり、
複雑になってしまうので、グローバルにしました。
次の
      String^ w;
にご注目下さい。
第13講や第14講では、関数の引数に入れていましたが、ここで宣言すると、

のオレンジの枠のところで有効な文字型変数になり、プログラムが簡単になります。
String^型はグローバルにできないのですが、ほぼグローバルになります。
どうしてか後で学習することになります。

次のw=L"";とs=0;はなくてもよいのですが、一応初期化しています。これがないと、ボタンを複数回押したときに
となっていまいます。w=L"";とs=0;を入れておけば、ボタンを何回押しても、
のままです。
wとsの初期化は、System::Void button1_Click内部で行った方が良いのです。


次のf(0);で引数0で関数void f(char g)を呼び出しています。
つまり、この場合0をgに渡しているのです。
このg何を意味しているのか、お分かりでしょうか。
このgとfor文のiの意味を明確につかんでおかないと、
このプログラムはチンプンカンプンになってしまいます。
このgが意味しているのは、

の枠番号です。それに対して、for文のi+1の方はその枠番号の枠に入れていく数字を意味しています。
それぞれの枠には1,2,3の数字が入力されます。i+1はその1,2,3に相当します。
つまり、for文のループによって













等と入力されていくわけです。続きは次話で。


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

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