排列组合

计算组合数

/*
e:数组长度
t:组合数组的长度
*/

nCr(e, t) {
      if (t > e) return 0;
      var n = 1;
      ~~(e / 2) + 1 > t && (t = e - t);
      for (var a = t + 1; a <= e; a++) n *= a;
      for (var r = 1; r <= e - t; r++) n /= r;
      return n;
    }

数组的重新组合

/**
      @param {} source 源数组
      @param {} count 要取出多少项
     * @return {any[]} 所有排列组合
     */
    getNumbers(source, count) {
      //如果只取一位,返回数组中的所有项,例如 [ [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 = this.getNumbers(source.slice(i + 1), count - 1);
        for (let child of children) {
          result.push([...current, ...child]);
        }
      }
      return result;
    }

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值