第9講 関数の再帰的使用
第6話 3次順列を関数の再帰的使用を使わずにfor文で実現する
3次順列生成プログラム
#include<stdio.h>
void f(int n);
int main() {
f(3);
return(0);
}
void f(int n) {
int i, j, k, l,h,hh, x[20], cn = 0;
for (i = 0; i<n; i++) {
x[0] = i + 1;
for (j = 0; j<n; j++) {
h = 1;
if (j + 1 == x[0])h = 0;
if (h == 1)x[1] = j + 1;
if (h == 1) {
for(k=0;k<n;k++){
hh=1;
for(l=0;l<2;l++){
if(k+1==x[l]){
hh=0;
break;
}
}
if(hh==1)x[2] = k + 1;
if(hh==1){
for(l=0;l<n;l++){
printf("%d ",x[l]);
}
printf("\n");
cn++;
}
}
}
}
}
printf("生成された順列は%d個です。\n", cn);
}
実行画面
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
生成された順列は6個です。
for文で作る順列生成ソフトは、4次を最後とします。
これを作っていただいている理由は、
関数の再帰的使用がいかに便利なものであるかを体感してもらためです。
for文だといちいちコードを作り直さなければなりませんが、
関数の再帰的使用だとコードが短いだけでなく、
汎用的なプログラムになります。
つまり、理論的には何次順列でも生成できるソフトになります。