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

JavaScriptで再帰を使って配列のすべての位置に要素を挿入する方法

要素 x と配列 arr を引数として受け取る関数、たとえば insertAllPositions を定義する必要があります。

この関数は「配列の配列」を返し、それぞれの内側の配列は、元の配列 arr の可能なすべての位置に要素 x を挿入した結果に対応します。

つまり、arr の長さが N である場合、結果は N + 1 個の配列を含む配列になります。

例えば、insertAllPositions(10, [1,2,3]) の結果は次のようになります −

const output = [
   [10,1,2,3],
   [1,10,2,3],
   [1,2,10,3],
   [1,2,3,10]
];

純粋な再帰だけで実装する

この関数は、ループを使用せずに再帰呼び出しだけで記述する必要があります。以下がそのコード例です −

const arr = [1, 2, 3];
const num = 10;
const insertAllPositions = (num, arr) => {
   return arr.length ?
   [[num, ...arr]]
   .concat(insertAllPositions(num, arr.slice(1))
   .map(el => {
      return [arr[0]].concat(el);
   })) :
   [[num]]
};
console.log(insertAllPositions(num, arr));

出力

コンソールには次の出力が表示されます −

[ [ 10, 1, 2, 3 ], [ 1, 10, 2, 3 ], [ 1, 2, 10, 3 ], [ 1, 2, 3, 10 ] ]

コードの仕組み

この再帰的なアプローチでは、まず現在の配列の先頭(インデックス 0)に num を挿入した配列 [num, ...arr] を作成します。次に、先頭要素を除いた残りの配列 arr.slice(1) に対して同じ関数を再帰的に呼び出し、その結果得られる各配列の先頭に元の配列の最初の要素 arr[0] を付け加えることで、挿入位置を一つずつ後ろへずらしていきます。

ベースケースは配列が空になったときで、この場合には [[num]](配列の末尾への挿入に相当する結果)を返します。これにより、長さ N の配列に対して、先頭から末尾までの N + 1 通りの挿入パターンがすべて生成されます。

  1. JavaScript配列から一意の値(重複なし)を取得する方法

    JavaScriptの配列に含まれる重複した値を取り除き、一意の値(ユニークな値)だけを取得したい場合は、Setオブジェクトを使うのが最もシンプルで効率的な方法です。 Setは同じ値を1つしか格納できないデータ構造のため、配列をnew Set()に渡すだけで自動的に重複が排除されます。その後、スプレッド構文([...set])を使えば、簡単に元の配列形式へ戻すことができます。 サンプルコード 以下は、JavaScriptの配列からすべての一意の値を取得する実際のコード例です。 <!DOCTYPE html> <html lang=ja> <head> <

  2. JavaScriptでソート済み配列に数値を挿入する方法|二分探索で順序を維持

    問題の概要 本記事では、昇順に並べ替えられた数値配列を第1引数に、単一の数値を第2引数として受け取るJavaScript関数を作成します。 関数に求められる要件は以下のとおりです。 第2引数で指定された数値を、配列内の適切な位置に挿入する 挿入後も要素のソート順(昇順)を崩さないこと 新しい配列を作成せず、元の配列を直接操作して実現すること 解決のアプローチ 挿入位置の特定には二分探索(バイナリサーチ)を使用します。先頭から順に比較する線形探索(計算量 O(n))と比べ、二分探索なら O(log n) で効率的に位置を見つけられます。 位置が判明したら、その位置以降の要素を一つずつ後ろへシ