第15講 関数の再帰的呼び出しによる順列の作成
第1話 順列とは?
順列とは何でしたか。
中学校や高校で学びましたよね。
123を例にすれば、順列とは
123,132,213,231,312,321
でした。
ここでは順列をすべて作り出すプログラムを考えます。
n個の順列をn次順列と名付けることにします。
そして、順列を2次元に並べれば方陣になります。
1 | 2 | 3 |
4 | 5 | 6 |
7 | 8 | 9 |
さらに、列・行・対角線の和が同じという条件を加えれば魔方陣が作成できます。
8 | 1 | 6 |
3 | 5 | 7 |
4 | 9 | 2 |
私が作っている魔方陣作成プログラムは、
基本的にはn次順列を作りそれを2次元に並べ、
列・行・対角線の和が同じという条件を満たすものをアウトプットする、
という作り方で作られています。
さらに、9次順列を作りそれをうまく配置して、
数独のルール
① 行に同じ数字が入らない
② 列に同じ数字が入らない
③ ブロックに同じ数字が入らない
の3つの条件を満たしているものをアウトプットすれば数独ができます。
4 | 2 | 5 | 3 | 6 | 9 | 1 | 8 | 7 |
6 | 1 | 9 | 8 | 4 | 7 | 3 | 5 | 2 |
3 | 8 | 7 | 2 | 5 | 1 | 4 | 6 | 9 |
2 | 6 | 4 | 9 | 7 | 5 | 8 | 3 | 1 |
5 | 7 | 3 | 1 | 2 | 8 | 6 | 9 | 4 |
1 | 9 | 8 | 6 | 3 | 4 | 2 | 7 | 5 |
7 | 5 | 6 | 4 | 1 | 3 | 9 | 2 | 8 |
9 | 4 | 2 | 5 | 8 | 6 | 7 | 1 | 3 |
8 | 3 | 1 | 7 | 9 | 2 | 5 | 4 | 6 |
ですから、順列は魔方陣作成と数独作成の基礎になるのです。
さらに、順列を応用すると時間割ソフトも可能です。
この場合は同じものを含む順列となります。
国語国語国語国語社会社会社会数学数学数学数学理科理科理科英語英語英語英語英語
のすべての場合を2次元に並べて、
同じ教科が1日に2つ入らない、
同じ先生が複数教室に行くことにならない、
などの条件を満たすものを見つけ出せば時間割ができてします。
順列とはとても威力があるということがお分かりでしょうか。
さて、順列の作成には実は関数の再帰的呼び出しが向いているのです。
どうしてでしょうか。
ヒントは、関数の再帰的呼び出しは同じようなことを繰り返すです。
考えてみてください。
第14講第7話へ 第2話へ
C言語 C++講義第1部へ
VB講義へ
VB講義基礎へ
vc++講義へ第1部へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)