🎶 Sym - 一款用 Java 实现的现代化社区(论坛/BBS/社交网络/博客)平台

📕 思源笔记 - 一款桌面端笔记应用,支持 Windows、Mac 和 Linux

🎸 Solo - B3log 分布式社区的博客端节点,欢迎加入下一代社区网络

♏ Vditor - 一款浏览器端的 Markdown 编辑器

Array - permutations (advanced)

2019-05-24

描述

⚠️ 警告:该方法的执行时间和数组中的每一个元素呈指数增长。任何超过 8 到 10 个元素的数组将会导致你的浏览器由于尝试解决所有不同的组合而被挂起。

为数组中的元素生成所有的排列组合。

提示

  • 使用递归
  • 依次指定数组中的每一个元素,然后使用剩下的元素来创建对应部分的所有排列
  • 使用 Array.prototype.map() 来连接指定元素和上一步骤中的排列组合结果
  • 使用 Array.prototype.reduce() 来组合每一次递归的结果
  • 基本的退出条件为数组的长度等于 2 或者 1

代码

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([1, 33, 5]); // [ [ 1, 33, 5 ], [ 1, 5, 33 ], [ 33, 1, 5 ], [ 33, 5, 1 ], [ 5, 1, 33 ], [ 5, 33, 1 ] ]

返回总目录

每天 30 秒系列之 JavaScript 代码


欢迎注册黑客派社区,开启你的博客之旅。让学习和分享成为一种习惯!

留下你的脚步