第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入門基礎講座