C++で配列の平均値を求める:反復法と再帰法の2つの実装方法を解説
長さNの整数配列 arr[N] が与えられたとき、その平均値を求めるのが本記事のテーマです。この問題は、反復処理(イテレーティブ)と再帰処理(リカーシブ)のどちらのアプローチでも解くことができます。ここでは両方の実装方法をわかりやすく紹介します。
配列の平均値とは、「配列内の全要素の合計」を「要素数」で割った値のことです。
反復法(Iterative Method)
反復法では、forループ、whileループ、do-whileループといった繰り返し構文を使用します。これらのループは、条件が真である限り文を実行し続けます。
まず具体例を見てから、反復法でどのように求めるのかを説明します。
入力
arr[] = {1, 2, 4, 5, 8}
出力
4
解説
全要素の合計 = 1+2+4+5+8 = 20 要素数 = 5 平均値 = 20/5 = 4
入力
arr[] = {10, 20, 30, 40}
出力
25
反復法のアプローチ
- ループを使って配列の各要素を先頭から順番に走査します。
- 配列の末尾に到達するまで、各要素を合計に加えていきます。
- 合計を要素数で割り、その結果を平均値として返します。
アルゴリズム
開始
ステップ1 → 反復法で平均を計算する関数を宣言する
double avg(int arr[], int size)
int sum = 0 を宣言
ループ For int i=0 かつ i<size かつ i++
sum += arr[i]
終了
return sum/size
ステップ2 → main() 内で
int arr[] = {2,3,1,6,8,10} を宣言
int size = sizeof(arr)/sizeof(arr[0]) を宣言
avg(arr, size) を呼び出す
終了
サンプルコード
#include <iostream>
using namespace std;
// 反復法で平均を計算する関数
double avg(int arr[], int size){
int sum = 0;
for (int i=0; i<size; i++)
sum += arr[i];
return sum/size;
}
int main(){
int arr[] = {2,3,1,6,8,10};
int size = sizeof(arr)/sizeof(arr[0]);
cout << "反復法による配列の平均値 : " << avg(arr, size) << endl;
return 0;
}
出力
上記のコードを実行すると、次の出力が得られます。
反復法による配列の平均値 : 5
補足:sum と size がどちらも int 型の場合、sum/size は整数除算となるため、小数点以下の精度が必要な場面では (double)sum / size のようにキャストすることをおすすめします。
再帰法(Recursive Method)
では、再帰的なアプローチとは何でしょうか。再帰法では、望む結果が得られるまで関数を何度も繰り返し呼び出します。再帰処理では、関数が返す値はスタックメモリに保存されるという特徴があります。
まず具体例を見てから、再帰法でどのように求めるのかを説明します。
入力
arr[] = {2, 4, 6, 8}
出力
5
解説
全要素の合計 = 2+4+6+8 = 20 要素数 = 4 平均値 = 20/4 = 5
入力
arr[] = {12, 23, 45, 15}
出力
19
再帰法のアプローチ
- 配列の末尾に到達するまで、関数を繰り返し呼び出します。
- 配列の各要素を加算していき、末尾に到達した時点で配列全体の平均値を返します。
アルゴリズム
開始
ステップ1 → 再帰法で平均を計算する関数を宣言する
double recursive(int arr[], int i, int size)
IF (i == size-1)
return arr[i]
終了
IF (i == 0)
return ((arr[i] + recursive(arr, i+1, size)) / size)
終了
return (arr[i] + recursive(arr, i+1, size))
ステップ2 → double avg(int arr[], int size)
return recursive(arr, 0, size)
ステップ3 → main() 内で
int arr[] = {1,5,3,2,6,7} を宣言
int size = sizeof(arr)/sizeof(arr[0]) を宣言
average(arr, size) を呼び出す
終了
サンプルコード
#include <iostream>
using namespace std;
// 再帰的に平均を計算する関数
double recursive(int arr[], int i, int size){
if (i == size-1)
return arr[i];
if (i == 0)
return ((arr[i] + recursive(arr, i+1, size)) / size);
return (arr[i] + recursive(arr, i+1, size));
}
// 平均を返す関数
double average(int arr[], int size){
return recursive(arr, 0, size);
}
int main(){
int arr[] = {1,5,3,2,6,7};
int size = sizeof(arr)/sizeof(arr[0]);
cout << "再帰法による配列の平均値 : " << average(arr, size) << endl;
return 0;
}
出力
上記のコードを実行すると、次の出力が得られます。
再帰法による配列の平均値 : 4
反復法はシンプルで直感的な一方、再帰法はコードが簡潔になる反面、深い再帰ではスタックオーバーフローのリスクがある点に注意しましょう。用途に応じて使い分けることが大切です。
-
C言語で配列の全要素の積を求めるプログラム
n個の要素を含む配列 arr[n] が与えられたとき、その配列内のすべての要素の積を求めることが課題となります。例えば、7つの要素からなる配列 arr[7] の場合、積は以下のように計算されます。例入力: arr[] = { 10, 20, 3, 4, 8 } 出力: 19200 説明: 10 × 20 × 3 × 4 × 8 = 19200 入力: arr[] = { 1, 2, 3, 4, 3, 2, 1 } 出力: 144解き方のアプローチ配列を入力として受け取る。配列のサイズを求める。配列を反復処理しながら、各要素を掛け合わせる。結果を表示する。アルゴリズム開始 関数 int pro
-
配列の全要素を乗算するC++プログラムの解説
整数型の要素を持つ配列が与えられたとき、配列内のすべての要素を掛け合わせ、その積を表示することを考えます。本記事では、この問題をC++(C言語スタイルのコード)で解く方法を、アプローチ、アルゴリズム、サンプルコード、実行結果まで順を追って解説します。 例 入力: arr[]={1,2,3,4,5,6,7} 出力: 1 x 2 x 3 x 4 x 5 x 6 x 7 = 5040 入力: arr[]={3, 4, 6, 2, 7, 8, 4} 出力: 3 x 4 x 6 x 2 x 7 x 8 x 4 = 32256 解き方のアプローチ この問題は、累積用の一時変数を用意し、配列の要素を先頭