再帰処理を使用して配列内の数値を整列させる_1(再帰、クイックソート)
このページでは、再帰処理を簡単に説明してみます。
再帰処理ですが、ある関数が自分自身を複数回呼び出し、
処理を進めるものをいいます。
// メイン関数
main( ){
func( );
}
// 再帰するように記述した関数
func( ){
func( )
}
この2つの関数からなるプログラムは、
1.メイン関数が実行されることで処理が開始されます。
2.メイン関が、再帰するように記述した関数func( )を
を飛び出します。
3.func( )関数が実行され、自関数 func( )関数が
再び呼び出されます。
4.3.の処理が無限に繰り返されます。
このような流れで、処理を進めるものです。
ですが、この例では、再帰を中断する仕組みが記述されて
いないので無限ループとなり、いずれメモリが消費され、
ハングアップします。
もう少し記述のあるものを図にしてみます。

このプログラムでは、
fanc( )関数を呼び出し時に引数で与えられた値が、
1より大きい場合、その値から1減算して、再び
fanc( )関数を呼び出すものです。
引数で与えられた値が、1になった時点で、再帰処理が
行われず、呼び出しを行ったfanc( )関数に処理が戻り、
呼び出しとは逆順に辿り、最後に最初fanc( )関数を呼び出した、
メイン関数へと戻り処理が終了します。
※この時、イメージとしてメモリ上には、メイン関数と、
再帰処理された数のfanc( )関数が積み上げられている
ことになります。この図の場合、メイン関数と、
fanc( )関数4つが一時的に常駐することになります。
実際の使用例として、
"1~10までの整数値の加算結果を表示する" プログラムを、
・繰り返し制御文 for( )文
関数名:fanc_repetition( )
・再帰処理
関数名:fanc_recursion
の二つの処理方法で記述し、比較してみます。
・プロジェクトを作成します。
Visual Studio 2022を起動し、
新しいプロジェクトを作成します。
・プロジェクトタイプ:"コンソールアプリ"
・プロジェクト名:"ct_108_1"
とします。



・プログラム記述・編集画面が表示されるので、
以下のプログラムを記述します。

プログラムの記述内容
// 繰り返し制御文と再帰処理
#include <iostream>
// プロトタイプ宣言
// 再帰処理による整数加算関数
int fanc_recursion(int);
// 繰り返し制御文による整数加算関数
int fanc_repetition(int);
// メイン関数
int main()
{
// 変数宣言
int ret;
// 再帰処理関数による 1~引数 までの整数加算関数呼び出し
ret = fanc_recursion(10);
// 計算結果表示
printf("再帰:%d\n", ret);
// 繰り返し制御文関数による 1~引数 までの整数加算関数呼び出し
ret = fanc_repetition(10);
// 計算結果表示
printf("繰り返し:%d\n", ret);
return EXIT_SUCCESS;
}
// 再帰処理による整数加算関数
int fanc_recursion(int x) {
if (x > 1) {
x = x + fanc_recursion(x - 1);
return x;
}
}
// 繰り返し制御文による整数加算関数
int fanc_repetition(int x) {
for (int i = x - 1; i > 0; i--) {
x += i;
}
return x;
}
※実際のプログラム例では、10, 9, 8・・・1 と
引数より1ずつ減算しながらの加算となっています。
・実行結果は、もちろんですが、両関数とも同じ結果 55 です。

もう1つ、
再帰処理による、階乗計算の結果を求めるプログラムを
記述してみます。
階乗計算は、指定された値以下の数値を掛け合わせた結果を
求めるもので、この指定数値は、キーボードから入力
するものとします。
※この時の数値とは自然数です。
指定数が 5 の場合、5 × 4 × 3 × 2 × 1 です。
・プロジェクトを作成します。
Visual Studio 2022を起動し、
新しいプロジェクトを作成します。
・プロジェクトタイプ:"コンソールアプリ"
・プロジェクト名:"ct_108_2"
とします。

プログラムの記述内容
// 再帰処理による階乗計算
#include <iostream>
// プロトタイプ宣言
int factorial_fanc(int);
// メイン関数
int main()
{
// 変数宣言
int result;
int value;
// キーボードからの値を受け取る
printf("階乗を求める数値:");
scanf_s("%d", &value);
// 階乗関数呼び出し
result = factorial_fanc(value);
// 計算結果の表示
printf("%dの階乗計算結果:%d\n", value, result);
return EXIT_SUCCESS;
}
// 階乗を求める関数
int factorial_fanc(int val) {
if (val < 1) {
return 1;
}
return (val * factorial_fanc(val - 1));
}
・実行結果は、キーボードから整数値 4 を入力した時の例です。
4 × 3 × 2 × 1 の結果となり、結果は 24 となります。


