JavaScriptで再帰処理を使って配列の中央の要素を取得する方法
本記事では、lengthプロパティにアクセスせず、かつfor文やwhile文などの組み込みループも使わずに、配列の中央にある要素を返す関数 findMiddle を実装します。
要件の整理
求められる仕様は以下のとおりです。
- 配列の要素数が奇数の場合 → 中央の要素を1つだけ返す
- 配列の要素数が偶数の場合 → 中央に位置する2つの要素を配列として返す
lengthプロパティは使用禁止- 組み込みのループ構文(for / while / for...of など)は使用禁止
実装方針:再帰で要素数を数える
ループが使えないため、ここでは再帰呼び出しを活用します。インデックスを1ずつ増やしながら自分自身を呼び出し、存在しない要素(undefined)に到達した時点で、その時点のインデックス=配列の長さであると判断できます。
あとはその長さが奇数か偶数かを判定し、対応する中央の要素を取り出すだけで完成です。コードは以下のようになります。
コード例
const arr = [1, 2, 3, 4, 5, 6, 7];
const array = [1, 2, 3, 4, 5, 6, 7, 8];
const findMiddle = (arr, ind = 0) => {
// 要素が存在する間、再帰的にインデックスを進める
if(arr[ind]){
return findMiddle(arr, ++ind);
};
// 要素数が奇数なら中央1つ、偶数なら中央2つを返す
return ind % 2 !== 0 ? [arr[(ind-1) / 2]] : [arr[(ind/2)-1],
arr[ind/2]];
};
console.log(findMiddle(arr));
console.log(findMiddle(array));
実行結果
コンソールには次のように出力されます。
[ 4 ] [ 4, 5 ]
コードの解説
この関数の動作を順を追って見ていきましょう。
- 再帰によるカウント:
arr[ind]が真値(要素が存在)である限り、indを1つ増やして再度findMiddleを呼び出します。これにより、lengthを参照することなく配列の要素数を求められます。 - 終了条件: インデックスが配列の範囲外に達すると
arr[ind]はundefinedとなり、再帰が終了します。このときのindが配列の長さです。 - 奇数の場合:
(ind - 1) / 2番目の要素が中央に相当するため、それを1要素の配列で返します。 - 偶数の場合: 中央は
ind/2 - 1番目とind/2番目の2箇所になるため、両方を含む配列を返します。
注意点
なお、この実装は再帰ごとに関数呼び出しが積み重なるため、非常に長い配列に対してはスタックオーバーフローのリスクがあります。実用上は数千〜数万要素程度までを目安にすると安全です。また、要素として 0 や空文字などの偽値(falsy)が含まれる場合、判定が意図どおりに動作しないため、より厳密には ind in arr を使ったチェックが推奨されます。
-
JavaScript配列で要素を検索する方法を徹底解説!find()メソッドの使い方
JavaScriptで配列の中から特定の要素を検索したい場面は非常に多くあります。本記事では、最もよく使われるfind()メソッドを中心に、実際に動作するサンプルコードとともに分かりやすく解説します。 find()メソッドとは find()メソッドは、配列の各要素に対して指定したテスト関数(コールバック関数)を実行し、条件を満たした最初の要素の値を返します。条件に一致する要素が存在しない場合は undefined を返します。 基本構文 arr.find(callback(element[, index[, array]])[, thisArg]) callback: 各要素をテストする関数
-
【C++入門】配列内で唯一異なる要素を検索するアルゴリズムと実装例
本記事では、サイズnの整数型配列arr[]が与えられたとき、その中に一つだけ存在する「異なる要素」を見つける問題を、C++で解く方法を解説します。 配列には2種類の値しか含まれておらず、ひとつを除いたすべての要素が同一の値を持っています。その「仲間はずれ」の要素を効率よく特定することが目標です。 問題例 具体的な入出力の例を見てみましょう。 入力: arr[] = {1, 1, 1, 2, 1, 1, 1, 1} 出力: 2 この例では、ほとんどの要素が「1」であるのに対し、「2」だけが異なるため、答えは2となります。 解法アプローチ 1. 全探索による単純なアプローチ(O(N²)) 最も直感