调试可能总和的数量 - JavaScript

时间:2018-02-07 16:34:30

标签: javascript algorithm debugging set subset

我正在编写一种算法,该算法可以查找包含唯一值的数组中可能的总和数,以及第二个包含第一个数组中每个相应值的数量的数组。例如,对[10, 20, 50] and [1, 2, 1]表示我合并的元素总数实际为[10, 20, 20, 50],因为有两个数字20的实例。

我的算法目前正在通过除了一个以外的所有测试,我不能为我的生活找出原因,因为它传递了其他更复杂的配对。这是我到目前为止的算法:

function possibleSums(values, quantity) {
  const sums = new Set([]);

    //my recursive function that finds all possible combinations moving 
    //down from a specific starting index in the valueArrray:

  const combinations = (valueArray, countArray, position, currentSum) => {
    if (currentSum > 0) sums.add(currentSum);

    for(let i = position; i < valueArray.length; i++){
        if (countArray[i] === 0){
            continue;
        }
        currentSum += valueArray[i];
            //reduce the count of that value that is still available
        countArray[i]--;
            //send off a recursive call to find the sum with the next 
            //available value
        combinations(valueArray, countArray, i, currentSum);
            //return the original count since `i` is increasing past 
            //the current value's location in the valueArray
        countArray[i]++;
     }
  }

  for (let i = 0; i < values.length; i++){
        //start the recursive function calls at each index in the value array
    combinations(values, quantity, i, 0)
  }
  return sums.size
}

此算法传递数组对,如:

[3, 1, 1] and [111, 84, 104],预期输出为521

[1, 1, 1, 1, 1] and [9, 19, 18, 12, 19],预期输出为77

[1, 2, 3] and [2, 3, 10000]预期输出为30008

但是失败了 [10, 50, 100, 500] and [5, 3, 2, 2],当预期输出为122

时输出96

有人能发现我逻辑中缺少的东西吗?

1 个答案:

答案 0 :(得分:1)

122预期输出对于记录来说不是太大的测试用例:)

让我们记录参数:

...
const combinations = (valueArray, countArray, position, currentSum) => {
  console.log(countArray, position, currentSum)

  if (currentSum...

我们看到了这一点,这是有道理的:

[ 0, 0, 0, 0 ] 3 1400

但是我们也看到了:

[ 0, 0, 1, 0 ] 3 1400
[ 0, 1, 0, 0 ] 3 1400
...
[ 1, 1, 1, 0 ] 3 1400

哪个没有。

在迭代期间更改当前参数似乎在其他调用期间影响变量。

更改

currentSum += valueArray[i];
...
combinations(valueArray, countArray, i, currentSum);

//currentSum += valueArray[i];
...
combinations(valueArray, countArray, i, currentSum + valueArray[i]);

似乎可以解决问题。