JavaScriptで再帰を使って配列の合計を求める方法|余分な変数なしで実装するテクニック
はじめに
今回は、「数値の配列の全要素を合計する再帰関数」を書くことを考えます。ただし、ここにはひとつの条件があります。その再帰関数では、余分な変数(メモリ)を一切初期化してはいけないというものです。
つまり、合計値を保存するための変数や、配列のインデックスをカウントするための変数などは使えません。すべて、すでに手元にあるものだけで実装する必要があります。
一見すると制約が厳しく感じますが、実はとてもシンプルな発想で解決できます。以下、その解法を紹介します。
アプローチのポイント
鍵となるのは、「すでに持っている配列そのもの」を活用することです。具体的には、配列の最初の要素(0番目の要素)を、再帰的な合計値を保持する場所として使います。
手順は次のとおりです。
- 配列から
pop()メソッドで末尾の要素を1つ取り出す - 取り出した要素を、配列の先頭の要素(
arr[0])に加算する - 配列の要素が1つになるまで、この処理を再帰的に繰り返す
最終的に要素が1つだけ残ったとき、それが配列全体の累積合計になります。あとはその値を返せば完成です。
コード例
const recursiveSum = arr => {
if(arr.length > 1){
arr[0] += arr.pop();
return recursiveSum(arr);
};
return arr[0];
};
console.log(recursiveSum([1,2,3,4]));
console.log(recursiveSum([1,2,3,4,3,6,3,32,7,9,5]));
console.log(recursiveSum([]));コードの仕組み
arr.pop()が配列の末尾の要素を取り除き、その値を返します。arr[0] += arr.pop()によって、末尾の値が先頭の要素に加算されます。- 配列の長さが1より大きい間は自分自身を呼び出し続け、長さが1になった時点で
arr[0]を返します。
実行結果
コンソールには次のように出力されます。
10 75 undefined
[1,2,3,4]の合計 → 10[1,2,3,4,3,6,3,32,7,9,5]の合計 → 75- 空の配列
[]→ undefined(要素が存在しないためarr[0]が未定義になります)
注意点
この実装はエレガントですが、いくつか気をつけるべき点があります。
- 元の配列が破壊される:
pop()を使うため、渡した配列自体が変更されます。元の配列を保持したい場合は、事前にコピー(例:recursiveSum([...arr]))を渡しましょう。 - 空の配列の扱い: 空配列の場合は
undefinedが返ります。必要に応じてarr.length === 0のケースで0を返すよう分岐を追加すると安全です。
まとめ
追加の変数を使わずに配列の合計を求める再帰関数は、配列の先頭要素を合計値の保持場所として再利用するという発想で実現できます。変数の初期化が許されない特殊な制約下でも、既存のデータ構造を工夫して活用することでクリーンな解法が得られる好例といえるでしょう。
-
JavaScriptでnewキーワードを使って配列を作成する方法
JavaScriptでは、newキーワードとArray()コンストラクタを使用することで、簡単に配列を作成できます。本記事では、実際に動作するサンプルコードとともに、その基本的な使い方を解説します。 サンプルコード 以下は、newキーワードを使用してJavaScriptの配列を作成するコード例です。 <!DOCTYPE html> <html lang=ja> <head> <meta charset=UTF-8 /> <meta name=viewport content=width=device-width, initial-sca
-
【JavaScript】filterとjoinを組み合わせて、条件に合う配列要素だけを結合する方法
JavaScriptでは、filter()メソッドとjoin()メソッドを組み合わせることで、条件を満たす要素だけを抽出し、それらを任意の区切り文字で1つの文字列に結合できます。本記事では、配列の中から「2で割り切れる要素(偶数)」だけを取り出して結合する具体例を、動作するサンプルコードとともに解説します。 処理の流れ:filter() と join() の役割 filter():コールバック関数が true を返した要素だけを集めた新しい配列を作成します。元の配列は変更されません。 join():配列内のすべての要素を、引数で指定した区切り文字で連結し、1つの文字列として返します。引数