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/BasicConceptsGroup(["`Basic Concepts`"]) javascript(("`JavaScript`")) -.-> javascript/AdvancedConceptsGroup(["`Advanced 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() 将所有排列组合成一个数组。
  4. 基本情况是针对长度为 21 的数组。
  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 中练习更多实验来提升你的技能。

您可能感兴趣的其他 JavaScript 教程