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

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() メソッドを使う選択肢もありますので、用途に応じて使い分けるとよいでしょう。

  1. JavaScriptで数字列の中から最大の5桁の連続数字を見つける方法

    問題少なくとも5桁以上の数字で構成される文字列を受け取るJavaScript関数を作成する必要があります。この関数は、与えられた数字列の中に含まれる「連続する5桁」の中で最も大きな数値を返さなければなりません。たとえば、入力が 123546544 の場合、取りうる5桁の組み合わせは「12354」「23546」「35465」「54654」「46544」となり、この中で最大のものは 54654 です。解決アプローチ考え方はシンプルです。文字列を先頭から1文字ずつずらしながら、5文字分を切り出す切り出したすべての5桁の部分文字列を配列に格納するMath.max() を使って最大値を求めるJavaSc

  2. 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