マルチスレッド版数独自動生成ソフトC++コードを題材とする超初心者のためのVisual Studio C++講義
第9章 関数の再帰的使用

第14話 1 × 2 × 3 × ・・・ × n を関数の再帰的利用で計算する!



1から10までの階乗は3628800です。

を実現するプログラムコード例

#include<iostream>//インクルードファイルiostreamの読み込み


#include<conio.h>//while(!_kbhit());を使うためのお呪い


#include<string> //文字列変数を使えるようにするために組み込む


#include <iomanip> //setprecisionを使えるように組み込む


#include <cmath>//powなどを使うときに必要


#include <ctime>//time()(←現時刻発生する関数)を使うために必要


using namespace std;//coutを使うときに必要なお呪い


const int n = 10;//具体的な数字を使うのではなく、 n を使うと汎用性のあるプログラムになる!


void f(int s);//順列生成関数←引数名をgからsに変更(2026年3月19日)


int a[25]; //将来5次魔方陣まで生成できるように25に変更


int 積 = 1; //gは合計を計算するための変数


int main() {


    f(0);


    cout << "1から" << n << "まで階乗は" << 積 << "です。" << endl;


    while (!_kbhit());//待機させるための命令


    return(0);


}


void f(int s) {


    積 = 積 * (s + 1);


    if (s + 1 < n)f(s + 1);


}

const int n = 5 の実験結果


1から5までの階乗は120です。


この実験結果の120は見覚えがありますね。


12345 12354 12435 12453 12534 12543 13245 13254 13425 13452
13524 13542 14235 14253 14325 14352 14523 14532 15234 15243
15324 15342 15423 15432 21345 21354 21435 21453 21534 21543
23145 23154 23415 23451 23514 23541 24135 24153 24315 24351
24513 24531 25134 25143 25314 25341 25413 25431 31245 31254
31425 31452 31524 31542 32145 32154 32415 32451 32514 32541
34125 34152 34215 34251 34512 34521 35124 35142 35214 35241
35412 35421 41235 41253 41325 41352 41523 41532 42135 42153
42315 42351 42513 42531 43125 43152 43215 43251 43512 43521
45123 45132 45213 45231 45312 45321 51234 51243 51324 51342
51423 51432 52134 52143 52314 52341 52413 52431 53124 53142
53214 53241 53412 53421 54123 54132 54213 54231 54312 54321
生成された順列は120個です。

そうです。

5次順列のすべての場合の数は5!になるのです。

ですから、順列の場合も n を大きくしてしまうと計算に時間がかかってしまいます。


1 + 2 + 3 + ・・・ + n と 1 × 2 × 3 × ・・・ × n を計算していただいたのは、

for文でできることはすべて再帰でできることを実感していただきたかったからです。

再帰はいろいろなことに応用できます。

魔方陣自動生成・数独自動生成・時間割編制ソフト開発、パズル生成、スケジューリング、AIの探索アルゴリズムにも

応用できるできることは前にも言ってあります。

非常に応用範囲が広いのです。

小学生・中学生等の児童・生徒が、この講義についてきたとすれば、

あなたたちは間違いなく天才です。

そのあなたたちなら、もっと広大な世界を切り開いてくれることでしょう。

あなたたちの肩に世界が乗っていると言っても誇張ではありません。

再帰とはそもそもヘーゲルやマルクスに切り開いた弁証法的な世界です。

重層的で弁証法的な世界の解析のために、

再帰は様々な可能性を持っています。




第9章第13話へ 第10章第1話へ

本講義トップへ