购物车,JS计算优惠组合可能的全排列方法

/***
 * 指定元素的排序可能
 */
function FullOrder(arr){
  var  permutatedArray = [];
  if(arr.length > 1){
       
    permutatedArray.push([arr.pop()]);
       
    for(var i = 0; i < arr.length; i++){
      var elementCur = arr[i];
      //这里很关键,必须先取len,因为后面数组长度会变化
      var len = permutatedArray.length;  
      for(var j = 0; j < len; j++){
        var p = permutatedArray.shift();
          
        for(var n = 0; n <= p.length; n++){
          //复制排列好的数组
          var r = p.slice(0);
          //插入数据到数组的位置
          r.splice(n, 0, elementCur);
          //保存
          permutatedArray.push(r)
        }
      }
    }
  }else{
    return permutatedArray.push([array[0]]);   
  }
  return permutatedArray;
}

/**
 * 指定数量的排列组合
 */
function NumberPermutation(arr, size) {
  var allResult = [];

  (function (arr, size, result) {
    var arrLen = arr.length;
    if (size > arrLen) {
      return;
    }
    if (size == arrLen) {
      allResult.push([].concat(result, arr))
    } else {
      for (var i = 0; i < arrLen; i++) {
          var newResult = [].concat(result);
          newResult.push(arr[i]);

          if (size == 1) {
              allResult.push(newResult);
          } else {
              var newArr = [].concat(arr);
              newArr.splice(0, i + 1);
              arguments.callee(newArr, size - 1, newResult);
          }
      }
    }
  })(arr, size, []);

  return allResult;
}

/**
 * 全排列(从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来)
 */
function FullPermutation(arr) {
  const result = [];
  for(let i = 0, len = arr.length; i< len; i++){
    result.push(...NumberPermutation(arr, i + 1))
  }
  return result;
}

console.log(FullOrder([1,2,3]))
console.log('-')
console.log(NumberPermutation([1,2,3], 2))
console.log('-')
console.log(FullPermutation([1,2,3]))

上述代码运行结果:

购物车,JS计算优惠组合可能的全排列方法_第1张图片

 

 

你可能感兴趣的:(javascript,全排列,购物车)