第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;
}
0 | 1 | 2 |
1 | 2 |
3番目の人形の
for(i=1;i<n+1;i++){
a[g]=i;
の第1ループによって
0 | 1 | 2 |
1 | 2 | 1 |
となりますが、これは重複検査
if(g>0){
for(j=0;j<g;j++){
if(a[g]==a[j]){
h=0;
break;
}
}
}
をクリアできず、ルー部の第2巡目になりますが、
0 | 1 | 2 |
1 | 2 | 2 |
これも重複検査
if(g>0){
for(j=0;j<g;j++){
if(a[g]==a[j]){
h=0;
break;
}
}
}
に抵触して、3番目の人形のだ3巡目に入り
0 | 1 | 2 |
1 | 2 | 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入門講義(基礎から応用まで)