第9講 関数の再帰的使用
第3話 関数の再帰的使用によるn次順列生成

階乗プログラミング例
#include<iostream>
using namespace std;
long f(int *x,int n,long cn,int p);
void g(int *x,int n);
void main(){
   int x[15],n;
   cout<<"何次順列を生成しますか?"<<endl;
   scanf("%d",&n);
   cout<<endl;
   cout<<n<<"次順列が"<<f(x,n,0,0)<<"個生成されました。"<<endl;
}
long f(int *x,int n,long cn,int p){
   int i,j;
   for(i=1;i<n+1;i++){
     x[p]=i;
     if(p>0){
        for(j=0;j<p;j++){
          if(x[p]==x[j])goto tobi;
        }
     }
     if(p+1<n){
        cn=f(x,n,cn,p+1);
     }
     else{
        g(x,n);
        cn++;
     }
     tobi:;
   }
   return(cn);
}
void g(int *x,int n){
   for(char i=0;i<n;i++)cout<<x[i]<<" ";
   cout<<endl;
}
参考ファイル
実行結果例
p

皆さん、?????・・・・!!?
ですよね。
わかりやすくするために
配列x、総数カウンタcn、次数nを
グローバル変数にして、
また、関数gの名称をhに、
pをgに変更します。
hは表示(hyouji)のhですし、
pをgに変更する理由は、
gは画面位置を表しているからです。
#include<iostream>
using namespace std;
void f(int g);
void h();
int x[15],n;
long cn;
void main(){
   cout<<"何次順列を生成しますか?"<<endl;
   scanf("%d",&n);
   cout<<endl;
   cn=0;
   f(0);
   cout<<n<<"次順列が"<<cn<<"個生成されました。"<<endl;
}
void f(int g){
   int i,j;
   for(i=1;i<n+1;i++){
     x[g]=i;
     if(g>0){
        for(j=0;j<g;j++){
          if(x[g]==x[j])goto tobi;
        }
     }
     if(g+1<n){
        f(g+1);
     }
     else{
        h();
        cn++;
     }
     tobi:;
   }
}
void h(){
   for(char i=0;i<n;i++)cout<<x[i]<<" ";
   cout<<endl;
}
参考ファイル
グローバル変数を用いたため
コードはかなり簡単にはなりました。
でも、初心者からするとさっぱり分からない!
ですよね。
大丈夫ですよ。
初心者の方でもわかるように次話で詳しく説明します。
プログラミングできなかった方は、
とりあえず上のコードを打って実験しましょう。
10次以上になると時間がかかりますから、
キーボードからnの値を2~9まで入れて実験して下さい。
u
また、待つ気力がある方は、
10次・11次なども試してみて下さい。
汎用性=普遍性のあるプログラミング
になっていることが確認できますね。
n=10としたときは、10次元ループになります。
nの値を入れ直すだけで、
異なる次元ループが可能になっていることが分かります。


第2話へ 第4話へ


a

魔方陣 数独で学ぶ VBA 入門
数独のシンプルな解き方・簡単な解法の研究
VB講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)
初心者のための VC++による C言語 C++ 入門 基礎から応用まで第1部
eclipse java 入門
java 入門 サイト 基礎から応用まで
VC++ C言語 C++ 入門 初心者 基礎から応用まで
本サイトトップへ