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)を正しく設定することが、再帰プログラムを安全かつ正確に動作させるポイントです。なお、要素数が非常に多い配列では再帰の深さが増えるため、スタックオーバーフローに注意が必要です。
-
C++で配列内の最大GCDを持つペアを検索する方法
問題の概要正の整数で構成される配列が与えられたとき、その中からGCD(最大公約数)が最大となる整数のペアを見つけるのがこの記事のテーマです。例として、配列 A = {1, 2, 3, 4, 5} を考えてみましょう。この場合の出力は 2 になります。ペア (2, 4) のGCDが 2 であり、それ以外のどのペアのGCDも 2 未満にしかならないためです。解法のアプローチこの問題を効率的に解くには、各約数の出現回数を記録するカウント配列を活用します。全体の流れは次の通りです。配列内の各要素について約数をすべて列挙し、カウント配列に記録します。1つの要素の約数列挙には O(√arr[i]) の時間
-
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! =