JavaScript における再帰的な配列の順列

JavaScriptJavaScriptBeginner
今すぐ練習

This tutorial is from open-source community. Access the source code

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

この実験では、JavaScript における配列の順列の概念を探ります。重複する要素が含まれていても、配列の要素のすべての可能な順列を生成するために再帰をどのように使用するかを学びます。また、map()reduce() などの配列メソッドを使って、異なる順列を単一の配列に結合する方法も理解します。ただし、8 から 10 個以上の要素を持つ配列に対してこの関数を実行すると、実行時間が大幅に増加し、ブラウザが停止する可能性があることに留意する必要があります。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL javascript(("JavaScript")) -.-> javascript/AdvancedConceptsGroup(["Advanced Concepts"]) javascript(("JavaScript")) -.-> javascript/BasicConceptsGroup(["Basic Concepts"]) javascript/BasicConceptsGroup -.-> javascript/variables("Variables") javascript/BasicConceptsGroup -.-> javascript/data_types("Data Types") javascript/BasicConceptsGroup -.-> javascript/arith_ops("Arithmetic Operators") javascript/BasicConceptsGroup -.-> javascript/comp_ops("Comparison Operators") javascript/BasicConceptsGroup -.-> javascript/cond_stmts("Conditional Statements") javascript/BasicConceptsGroup -.-> javascript/array_methods("Array Methods") javascript/BasicConceptsGroup -.-> javascript/obj_manip("Object Manipulation") javascript/AdvancedConceptsGroup -.-> javascript/higher_funcs("Higher-Order Functions") javascript/AdvancedConceptsGroup -.-> javascript/spread_rest("Spread and Rest Operators") subgraph Lab Skills javascript/variables -.-> lab-28151{{"JavaScript における再帰的な配列の順列"}} javascript/data_types -.-> lab-28151{{"JavaScript における再帰的な配列の順列"}} javascript/arith_ops -.-> lab-28151{{"JavaScript における再帰的な配列の順列"}} javascript/comp_ops -.-> lab-28151{{"JavaScript における再帰的な配列の順列"}} javascript/cond_stmts -.-> lab-28151{{"JavaScript における再帰的な配列の順列"}} javascript/array_methods -.-> lab-28151{{"JavaScript における再帰的な配列の順列"}} javascript/obj_manip -.-> lab-28151{{"JavaScript における再帰的な配列の順列"}} javascript/higher_funcs -.-> lab-28151{{"JavaScript における再帰的な配列の順列"}} javascript/spread_rest -.-> lab-28151{{"JavaScript における再帰的な配列の順列"}} end

すべての配列の順列を生成する方法

コーディングを練習するには、ターミナル/SSH を開き、node と入力します。

ここに、配列の要素のすべての順列(重複する要素が含まれていても)を生成するアルゴリズムがあります。これを実装するには、次の手順に従ってください。

  1. 再帰を使用します。
  2. 与えられた配列の各要素に対して、その他の要素のすべての部分順列を作成します。
  3. Array.prototype.map() を使用して要素と各部分順列を結合し、次に Array.prototype.reduce() を使用してすべての順列を 1 つの配列に結合します。
  4. 基本ケースは、長さが 2 または 1 の配列です。
  5. この関数の実行時間は、配列要素ごとに指数関数的に増加することに注意してください。8 から 10 個以上のエントリがある場合、すべての異なる組み合わせを解こうとするときにブラウザが停止する可能性があります。

コードは次のとおりです。

const permutations = (arr) => {
  if (arr.length <= 2) return arr.length === 2 ? [arr, [arr[1], arr[0]]] : arr;
  return arr.reduce(
    (acc, item, i) =>
      acc.concat(
        permutations([...arr.slice(0, i), ...arr.slice(i + 1)]).map((val) => [
          item,
          ...val
        ])
      ),
    []
  );
};

permutations() 関数に配列引数を渡してコードをテストできます。

permutations([1, 33, 5]);
// [ [1, 33, 5], [1, 5, 33], [33, 1, 5], [33, 5, 1], [5, 1, 33], [5, 33, 1] ]

まとめ

おめでとうございます!あなたは配列の順列の実験を完了しました。あなたのスキルを向上させるために、LabEx でさらに実験を練習することができます。