第15講 関数の再帰的呼び出しによる順列の作成
第10話 順列作成プログラムの解説6(2個目の順列の生成・表示)
コード再掲
#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 | 3 |
2回目の3番目の人形のループ
for(i=1;i<n+1;i++){
a[g]=i;
によって、
0 | 1 | 2 |
1 | 3 | 1 |
となりますが、重複検査
if(g>0){
for(j=0;j<g;j++){
if(a[g]==a[j]){
h=0;
break;
}
}
}
に抵触して、第2回目のループで
0 | 1 | 2 |
1 | 3 | 2 |
となり重複検査を通過して
if(h==1){
if(g+1<n){
f1(g+1);
}
else{
cn++;
f2();
}
}
の実行になります。g=2よりg+1=3でg+1<nすなわちg+1<3は偽ですので、
else文が実行され
cn++;
f2();
カウンターが2となり、表示関数f2が呼び出され2個目の順列がコンソール画面に表示されます。
C言語 C++講義第1部へ
VB講義へ
VB講義基礎へ
vc++講義へ第1部へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)