第15講 関数の再帰的呼び出し
第6話 関数の再帰的呼び出しによる順列作成の解説その3
2 |
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;によって、
0 | 1 | 2 |
1 | 2 | 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回目のループで、
0 | 1 | 2 |
1 | 2 | 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回目の履行で、
0 | 1 | 2 |
1 | 2 | 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個目の順列
1 | 2 | 3 |
が出来上がったのです。
これで、g=2の世界すなわち
2 |
3 |
の世界のループが終了となり、
g=1の世界すなわち
1 |
2 |
に戻ります。
U(g=1の世界)i=2のとき、
a[g]=i+1;により、
0 | 1 | 2 |
1 | 3 | 3 |
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 |
3 |
への2度目の飛翔が行われます。
V(g=2の世界)i=0のとき、
0 | 1 | 2 |
1 | 3 | 1 |
これは、
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のとき、
0 | 1 | 2 |
1 | 3 | 2 |
となります。
このときは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個目の順列
1 | 3 | 2 |
が出来上がったのです。
続きのトレースは次話で
第11講第6話へ 第12講第1話へ 第14講第10話へ 第15講第5話へ 第15講第7話へ
VC++講義第1部へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual
Basic入門基礎講座