C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++で再帰を使って配列の最小値・最大値を求める方法

整数型の配列 Arr[] が入力として与えられます。この記事では、再帰(リカーシブ)処理を用いて、配列の中から最大要素と最小要素を見つける方法を解説します。

再帰を利用する場合、配列の長さ(len)が 1 になるまで再帰呼び出しを繰り返し、len == 1 になった時点で arr[0] を返します。これがベースケース(基本ケース)です。それ以外の場合は、現在の要素とこれまでに求めた最小値(または最大値)を比較し、より小さい(または大きい)方の値を返しながら、残りの要素へ再帰的に処理を進めていきます。

入出力シナリオの例

入力 − Arr = {12, 67, 99, 76, 32}

出力 − 配列の最大値 : 99

説明 − すべての要素の中で 99 が最大であるため。

入力 − Arr = {1, 0, -99, 9, 3}

出力 − 配列の最小値 : -99

説明 − すべての要素の中で -99 が最小であるため。

プログラムで使用するアプローチ

最小値を求める場合

  • 配列 Arr[] を入力として受け取ります。
  • 関数 recforMin(int arr[], int len) は、入力配列とその長さを受け取り、再帰によって配列内の最小値を返します。
  • 整数変数 minimum を用意します。
  • 現在のインデックス len が 1 の場合は、minimum = arr[0] として minimum を返します(ベースケース)。
  • それ以外の場合は、minimum = min(arr[len], recforMin(arr, len-1)) として計算し、その値を返します。
  • 最終的に、配列全体の最小要素が返されます。
  • main 関数内で結果を出力します。

最大値を求める場合

  • 配列 Arr[] を入力として受け取ります。
  • 関数 recforMax(int arr[], int len) は、入力配列とその長さを受け取り、再帰によって配列内の最大値を返します。
  • 整数変数 maximum を用意します。
  • 現在のインデックス len が 1 の場合は、maximum = arr[0] として maximum を返します(ベースケース)。
  • それ以外の場合は、maximum = max(arr[len], recforMax(arr, len-1)) として計算し、その値を返します。
  • 最終的に、配列全体の最大要素が返されます。
  • main 関数内で結果を出力します。

再帰による最小値の探索

コード例

#include <iostream>
using namespace std;
int recforMin(int arr[], int len){
    int minimum;
    if (len == 1){
        minimum = arr[0];
        return minimum;
    }
    else{
        return minimum = arr[len] < recforMin(arr, len-1) ? arr[len] : recforMin(arr, len-1);
    }
}
int main(){
    int Arr[] = {-89, 98, 76, 32, 21, 35, 100};
    int length = sizeof(Arr)/sizeof(Arr[0]);
    cout << "Minimum in the array :" << recforMin(Arr, length);
    return 0;
}

実行結果

Minimum in the array :-89

再帰による最大値の探索

コード例

#include <iostream>
using namespace std;
int recforMax(int arr[], int len){
    int maximum;
    if (len == 1){
        maximum = arr[0];
        return maximum;
    }
    else{
        return maximum = arr[len] > recforMax(arr, len-1) ? arr[len] : recforMax(arr, len-1);
    }
}
int main(){
    int Arr[] = {-89, 98, 76, 32, 21, 35, 100};
    int length = sizeof(Arr)/sizeof(Arr[0]);
    cout << "Maximum in the array :" << recforMax(Arr, length);
    return 0;
}

実行結果

Maximum in the array :100

まとめ

このように、再帰を使えばループ処理を書かずとも、配列の末尾から順に要素を比較していくことで最小値・最大値を求められます。ベースケース(len == 1)を正しく設定することが、再帰プログラムを安全かつ正確に動作させるポイントです。なお、要素数が非常に多い配列では再帰の深さが増えるため、スタックオーバーフローに注意が必要です。

  1. C++で配列内の最大GCDを持つペアを検索する方法

    問題の概要正の整数で構成される配列が与えられたとき、その中からGCD(最大公約数)が最大となる整数のペアを見つけるのがこの記事のテーマです。例として、配列 A = {1, 2, 3, 4, 5} を考えてみましょう。この場合の出力は 2 になります。ペア (2, 4) のGCDが 2 であり、それ以外のどのペアのGCDも 2 未満にしかならないためです。解法のアプローチこの問題を効率的に解くには、各約数の出現回数を記録するカウント配列を活用します。全体の流れは次の通りです。配列内の各要素について約数をすべて列挙し、カウント配列に記録します。1つの要素の約数列挙には O(√arr[i]) の時間

  2. C++で配列要素の階乗の最大公約数(GCD)を求める方法

    N個の要素を持つ配列Aが与えられたとき、配列内のすべての要素の階乗の最大公約数(GCD)を求めることを考えます。例えば、配列の要素が {3, 4, 8, 6} の場合、各要素の階乗は 3! = 6、4! = 24、8! = 40320、6! = 720 となり、これらのGCDは 6 になります。解法のポイントここで重要な数学的な性質があります。2つの数のGCDとは、両方の数を割り切る最大の数のことです。階乗の場合、小さい数の階乗は必ず大きい数の階乗を割り切ることができます。つまり、2つの階乗のGCDは、小さい方の数の階乗そのものになります。例えば、3! と 5! のGCDを考えると、3! =