JavaScriptの再帰処理を使って配列内の最小値を求める方法
はじめに
本記事では、数値の配列を受け取り、再帰(リカーション)を活用してその中から最小値を返すJavaScript関数の作成方法を解説します。ループ構文を使わずに関数自身を呼び出すことで、簡潔かつエレガントに実装できるのがポイントです。
サンプルデータ
まず、今回扱う配列の例を見てみましょう。負の値のみの配列と、正負混在の配列の2種類を用意しました。
const arr1 = [-2, -3, -4, -5, -6, -7, -8]; const arr2 = [-2, 5, 3, 0];
1つ目の配列では -8、2つ目の配列では -2 が最小値として期待される結果です。
実装コード
以下が実際のコードです。内部に定義したヘルパー関数 helper を再帰的に呼び出すことで、配列の先頭から順に要素を比較していきます。
const arr1 = [-2, -3, -4, -5, -6, -7, -8];
const arr2 = [-2, 5, 3, 0];
const min = arr => {
const helper = (a, ...res) => {
// 比較対象がなくなったら、現時点の最小値 a を返す
if (!res.length) {
return a;
}
// 先頭要素 a の方が小さければ、比較対象を置き換える
if (a < res[0]) {
res[0] = a;
}
// 残りの要素で再帰的に処理を続ける
return helper(...res);
};
return helper(...arr);
};
console.log(min(arr1));
console.log(min(arr2));
コードの仕組み
この実装のポイントは以下の通りです。
- ベースケース:
resが空配列になった時点で、それ以上比較する要素がないため、現在の最小値aを返して再帰を終了します。 - 比較と更新: 現在の候補値
aが次の要素res[0]より小さい場合、res[0]をaに置き換えることで最小値を引き継ぎます。 - 再帰呼び出し: スプレッド構文
...resを使って残りの要素を渡すことで、配列を1つずつ縮めながら処理を進めます。
実行結果
コンソールには次のように出力されます。
-8 -2
期待どおり、各配列の最小値が正しく取得できていることが確認できます。
まとめ
再帰を使った最小値の探索は、可変長引数(レスト構文)と組み合わせると非常にシンプルに書けます。ただし、要素数が非常に多い配列では再帰の深さ制限(スタックオーバーフロー)に注意が必要です。実務では Math.min(...arr) や reduce() メソッドを使う選択肢もありますので、用途に応じて使い分けるとよいでしょう。
-
JavaScriptで数字列の中から最大の5桁の連続数字を見つける方法
問題少なくとも5桁以上の数字で構成される文字列を受け取るJavaScript関数を作成する必要があります。この関数は、与えられた数字列の中に含まれる「連続する5桁」の中で最も大きな数値を返さなければなりません。たとえば、入力が 123546544 の場合、取りうる5桁の組み合わせは「12354」「23546」「35465」「54654」「46544」となり、この中で最大のものは 54654 です。解決アプローチ考え方はシンプルです。文字列を先頭から1文字ずつずらしながら、5文字分を切り出す切り出したすべての5桁の部分文字列を配列に格納するMath.max() を使って最大値を求めるJavaSc
-
JavaScriptで配列内の特定の数値に最も近い2つの要素を検索する方法
問題の概要JavaScriptで、ソート済みの整数配列 arr を第一引数に、目標となる数値 target を第二引数に受け取る関数を作成します。この関数は、配列内に存在する要素の中から target に最も近い2つの数値を選び、それらを昇順に並べた配列として返す必要があります。例えば、以下のような入力が与えられた場合を考えてみましょう。入力:const arr = [1, 2, 3, 4, 5];const target = 3;出力:const output = [2, 3];この場合、target の値が 3 であるため、最も近い2つの要素は 2 と 3 となり、昇順に並べて [2, 3