第9講 社員の分身の術(関数の再帰的使用)
第6話 2次順列for文版
個数がnの順列をn次順列と名付けることにします。
これは一般的な名称ではなく、
このサイトのみで通用する名称です。
いきなりn次順列を分身の術(関数の再帰的呼び出し)で作るのは難しいですから、
まず最初に、2次順列すなわち
12
21
をfor文で実現するすることを考えましょう。
これでも、初心者には難しい課題ですから、
参考例を書いておきます。
#include<stdio.h>
void f(); //順列を作り出す社員
void hy(); //出来た順列をコンソールに表示させる社員
int cn,n;
int x[20]; //少し大きめに配列要素数を取っておく
int main(){
n=2;
f();
printf("順列総数=%d",cn);
}
void f(){
int i,j;
for(i=0;i<n;i++){
x[0]=i+1;
for(j=0;j<n;j++){
if((j+1)!=x[0]){ //このif文は重複チェックを任務とする
x[1]=j+1;
cn++;
hy();
}
}
}
}
void hy(){
int i;
for(i=0;i<n;i++){
printf("%d ",x[i]);
}
printf("\n");
}
コピペ用添付ファイル
実行画面
1 2
2 1
順列総数=2
解説
if((j+1)!=x[0]){ //このif文は重複チェックを任務とする
x[1]=j+1;
cn++;
hy();
}
注訳文にも書いてありますが、
このif文は、11等の重複を検査しています。
順列の定義(約束事)は、同じ数字を重ねて使ってはいけないです。
(尚、11のように同じ数字を複数使うことを認める順列を重複順列といいます。
ただ単に順列という場合、数字の重なりを認めません。
数字の重なりを認めませんから、
2次順列の場合12と21しかありません。)
(j+1)!=x[0]ですから、数字が重なっていない場合だけ、
x[1]=j+1;
cn++;
hy();
が実行されます。
すなわち、代入され順列総数のカウントが行われ、
hy();によってコンソールに12等と表示されます。
では皆さん、2次順列for版を参考に3次順列for版を考えて下さい。
第5話へ 第7話へ
初心者のための excel 2016 マクロ VBA 入門講義 基礎から応用まで
vc++ c言語 c++ 入門 初心者 基礎から応用まで
eclipse c++ 入門
魔方陣 数独で学ぶ VBA 入門
数独のシンプルな解き方・簡単な解法の研究
VB講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)
初心者のための VC++による C言語 C++ 入門 基礎から応用まで第1部
eclipse java 入門
java 入門 サイト 基礎から応用まで
本サイトトップへ