第9講 関数の再帰的使用
第9話 普遍的n次生成ソフト開発
実行画面
これはすべての順列を求めるソフトです。
何の順列を発生させるのかをnに入力してエンターして下さい。
n=4
1 2 3 4 
1 2 4 3 
1 3 2 4 
1 3 4 2 
1 4 2 3 
1 4 3 2 
2 1 3 4 
2 1 4 3 
2 3 1 4 
2 3 4 1 
2 4 1 3 
2 4 3 1 
3 1 2 4 
3 1 4 2 
3 2 1 4 
3 2 4 1 
3 4 1 2 
3 4 2 1 
4 1 2 3 
4 1 3 2 
4 2 1 3 
4 2 3 1 
4 3 1 2 
4 3 2 1 
生成された順列は24個です。
を実現するソフトのコード例
#include<iostream> //入出力のために組み込む
using namespace std; //coutを使うために必要なお呪い
void f(int g);
int x[25]; //将来5次魔方陣まで生成できるように25に変更
int n,cn; //aをnに変更 変更理由はnuberの頭文字nは整数を表す場合が多いからです
int main() {
  cout<< "これはすべての順列を求めるソフトです。" << endl;
  cout<< "何の順列を発生させるのかをnに入力してエンターして下さい。" << endl;
  cout<< "n=";
  scanf("%d", &n);
  cn=0;
  f(0);
  cout << "生成された順列は" << cn << "個です"
<< endl;
  return(0);
}
void f(int g){
  int i,j,h;
  for(i=0;i<n;i++){
    if(g==0)x[g]=i+1;
    h=1;
    if(g>0){
      for(j=0;j<g;j++){
        if(x[j]==i+1){
          h=0;
          break;
        }
      }
      if(h==1)x[g]=i+1;
    }
    if(h==1){
      if (g+1 < n){
        f(g+1);
      }
      else{
        for(j=0;j<n;j++)cout << x[j] << " ";
        cout << endl;
        cn++;
      }
    }
  }
}
これはソフトやアプリの名に恥じないプログラムです。
キーボードからnの値を入力してやれば、
何次でも自動生成できるからです。
ただし、30次辺りになると膨大な時間がかかりますが。
ですが、皆さんの頭の中は爆発しそうになっていませんか。
いや、もうすでに爆発しているよ!
という人もいるでしょうね。
第10話で詳しく解説しましょう。
