美文网首页
取出数组中所有排列组合(JS实现)

取出数组中所有排列组合(JS实现)

作者: 银魂飞雪 | 来源:发表于2019-04-11 16:58 被阅读0次

先定义一个函数,用于从 指定数组 取出 指定数量 的所有排列组合情况。

原理如下

  1. 先取第一项的所有情况,得到一个数组, 类似[ [1], [2], [3] ]
  2. 递归取出count - 1的所有情况,得到一个数组,类似 [ [a, b], [a,c], [a, d] ]
  3. 把第1步和第2步的两个数组交叉组合,即可得到最终结果

代码如下

/**
 * 
 * @param {*} source 源数组
 * @param {*} count 要取出多少项
 * @param {*} isPermutation 是否使用排列的方式
 * @return {any[]} 所有排列组合,格式为 [ [1,2], [1,3]] ...
 */
function getNumbers(source, count, isPermutation = true) {
  //如果只取一位,返回数组中的所有项,例如 [ [1], [2], [3] ]
  let currentList = source.map((item) => [item]);
  if (count === 1) {
    return currentList;
  }
  let result = [];
  //取出第一项后,再取出后面count - 1 项的排列组合,并把第一项的所有可能(currentList)和 后面count-1项所有可能交叉组合
  for (let i = 0; i < currentList.length; i++) {
    let current = currentList[i];
    //如果是排列的方式,在取count-1时,源数组中排除当前项
    let children = [];
    if (isPermutation) {
      children = getNumbers(source.filter(item => item !== current[0]), count - 1, isPermutation);
    }
    //如果是组合的方法,在取count-1时,源数组只使用当前项之后的
    else {
      children = getNumbers(source.slice(i + 1), count - 1, isPermutation);
    }
    for (let child of children) {
      result.push([...current, ...child]);
    }
  }
  return result;
}

let arr = [1, 2, 3];

const result = getNumbers(arr, 2, false);
console.log(result);
//[ [ 1, 2 ], [ 1, 3 ], [ 2, 3 ] ]

const result2 = getNumbers(arr, 2);
console.log(result2);
//[ [ 1, 2 ], [ 1, 3 ], [ 2, 1 ], [ 2, 3 ], [ 3, 1 ], [ 3, 2 ] ]

一个关键点

  • 如果是排列的方式,后续数组,只要排除当前项即可
    getNumbers(source.filter(item => item !== current[0]), count - 1, isPermutation);

  • 如果是组合方式,后续数组只能当前项之后的值
    getNumbers(source.slice(i + 1), count - 1, isPermutation);

原因是:
当第一项为3时,
如果是排列,那么第二项允许为1;
如果是组合,则不允许为1——理由:当第一项为1时,已经有过1,3的组合,所以第一项为3,不允许出现3,1的组合

输出所有排列组合

循环数组长度,调用上面的函数即可

let arr = [1, 2, 3];

for (let i = 1; i <= arr.length; i++) {
  console.log(getNumbers(arr, i));
  console.log('\r\n');
}
console.log('\r\n--------\r\n');

for (let i = 1; i <= arr.length; i++) {
  console.log(getNumbers(arr, i, false));
  console.log('\r\n');
}


//输出结果如下
[ [ 1 ], [ 2 ], [ 3 ] ]

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

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

--------

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

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

[ [ 1, 2, 3 ] ]

相关文章

  • 取出数组中所有排列组合(JS实现)

    先定义一个函数,用于从 指定数组 取出 指定数量 的所有排列组合情况。 原理如下 先取第一项的所有情况,得到一个数...

  • JS:数组排列组合

    JS:数组排列组合 原数组const source = [ ['black', 'white', 'red', ...

  • 链表的中间结点

    题目: 题目的理解: 将所有的节点取出保存到数组中,然后获取数组中的中间值。 python实现 看来简单题还是比较...

  • stream 流 实现 多集合 取交集

    stream 流 实现 多集合 取交集 题目描述: 提供多个数组,取出所有数组的 交集 示例: 输入: 输出: 思...

  • 排列组合

    排列组合计算公式如下: 1、从n个不同元素中取出m(m≤n)个元素的所有排列的个数,叫做从n个不同元素中取出m个元...

  • JavaScript数组随机排序

    实现JS中数组随机排序的代码很简单,

  • 手动实现简单的Bus总线

    在emit里面遍历数组 取出函数 执行函数 main.js bus.js 使用

  • js中数组flat方法的使用和实现

    js中数组flat方法的使用和实现 定义 flat() 方法会按照一个可指定的深度递归遍历数组,并将所有元素与遍历...

  • 三、快速排序

    思想:(1)找一个数组的基准点,从数组中取出,改变原数组(用splice实现) (2)生成left和r...

  • 选择排序OC

    算法的个人理解: 实现思路是从数组中取出每一个元素,依次和数组中剩余的元素进行比较,找出数组中最大或者最小的...

网友评论

      本文标题:取出数组中所有排列组合(JS实现)

      本文链接:https://www.haomeiwen.com/subject/eacxwqtx.html