再帰処理を使用して配列内の数値を整列させる_1(再帰、クイックソート)

このページでは、再帰処理を簡単に説明してみます。
再帰処理ですが、ある関数が自分自身を複数回呼び出し、
処理を進めるものをいいます。

 // メイン関数
 main( ){
     func( );
 }

 // 再帰するように記述した関数
 func( ){
     func( )
 }

この2つの関数からなるプログラムは、
 1.メイン関数が実行されることで処理が開始されます。
 2.メイン関が、再帰するように記述した関数func( )を
  を飛び出します。
 3.func( )関数が実行され、自関数 func( )関数が
  再び呼び出されます。
 4.3.の処理が無限に繰り返されます。
このような流れで、処理を進めるものです。
ですが、この例では、再帰を中断する仕組みが記述されて
いないので無限ループとなり、いずれメモリが消費され、
ハングアップします。

もう少し記述のあるものを図にしてみます。

再帰 図1
再帰 図1

このプログラムでは、
fanc( )関数を呼び出し時に引数で与えられた値が、
1より大きい場合、その値から1減算して、再び
fanc( )関数を呼び出すものです。
引数で与えられた値が、1になった時点で、再帰処理が
行われず、呼び出しを行ったfanc( )関数に処理が戻り、
呼び出しとは逆順に辿り、最後に最初fanc( )関数を呼び出した、
メイン関数へと戻り処理が終了します。
※この時、イメージとしてメモリ上には、メイン関数と、
 再帰処理された数のfanc( )関数が積み上げられている
 ことになります。この図の場合、メイン関数と、
 fanc( )関数4つが一時的に常駐することになります。  

実際の使用例として、
"1~10までの整数値の加算結果を表示する" プログラムを、
・繰り返し制御文 for( )文
  関数名:fanc_repetition( )
・再帰処理
  関数名:fanc_recursion
の二つの処理方法で記述し、比較してみます。

・プロジェクトを作成します。
 Visual Studio 2022を起動し、
 新しいプロジェクトを作成します。
 ・プロジェクトタイプ:"コンソールアプリ"
 ・プロジェクト名:"ct_108_1"
 とします。

プロジェクトの作成1
プロジェクトの作成1
プロジェクトの作成2
プロジェクトの作成2
プロジェクトの作成3
プロジェクトの作成3

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

記述後の記述・編集画面1
記述後の記述・編集画面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
実行結果、デバックコンソール画面1

もう1つ、
再帰処理による、階乗計算の結果を求めるプログラムを
記述してみます。
階乗計算は、指定された値以下の数値を掛け合わせた結果を
求めるもので、この指定数値は、キーボードから入力
するものとします。
※この時の数値とは自然数です。
 指定数が 5 の場合、5 × 4 × 3 × 2 × 1 です。

・プロジェクトを作成します。
 Visual Studio 2022を起動し、
 新しいプロジェクトを作成します。
 ・プロジェクトタイプ:"コンソールアプリ"
 ・プロジェクト名:"ct_108_2"
 とします。

記述後の記述・編集画面2
記述後の記述・編集画面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 となります。

実行結果、デバックコンソール画面2
実行結果、デバックコンソール画面2