使用递归搜索整数数组中的所有元素组合

时间:2015-04-15 12:55:28

标签: javascript arrays recursion combinations

我正在使用JS从Coderbyte处理这个问题:

让函数ArrayAdditionI(arr)获取存储在arr中的数字数组,如果数组中的任何数字组合可以添加到数组中的最大数字,则返回字符串true,否则返回字符串错误。例如:如果arr包含[4,6,23,10,1,3],则输出应返回true,因为4 + 6 + 10 + 3 = 23.数组不会为空,不包含所有相同的元素,并且可能包含负数。

对于递归解决方案来说问题似乎已经成熟,考虑到需要探索数组元素的各种组合的分支性质。我还想使用递归来获得一些额外的练习。我对编码仍然很陌生。

以下是我提出的解决方案,直到我开始测试并发现它根本不是解决方案之前我对它非常满意:

function ArrayAdditionI(arr) { 
  // sorting the array to easily remove the biggest value
  var sArr = arr.sort(function (a, b) {
    return a-b;});
  // removing the biggest value
  var biggest = sArr.pop();
  // count will be iterated to stop the recursion after the final element of the array has been processed
  var count = 0;
  function recursion (start, i) {
    if (sArr[i] + start === biggest) {
      return true;
    }
    else if (start + sArr[i] < biggest) {
      return recursion(start + sArr[i], i+1);
    }
    else if (start + sArr[i] > biggest && count < sArr.length) {
      count++;
      return recursion(0, count);
    }
    else {
      return false;
    }
  }
  return recursion(0,0);
}

只有当可以求和以满足基本情况的数组元素彼此相邻时,此代码才有效;例如,调用ArrayAdditionI([1,2,3,4])将不起作用,因为必须求和以达到目标值的两个元素(位置0中的“1”和位置2中的“3”)是不相邻。

我的流程将返回1,然后是1 + 2,然后是1 + 2 + 3,然后是2,然后是2 + 3,然后是3,最后返回 false ,因为目标(4)是还没到。

我可以想象一个正确的解决方案需要如何流经给定的数组,但我不知道如何通过递归来实现这一点。对于给定的数组[1,2,3,4],流程应检查此模式中的结果:(position0,pos0 + pos1,pos0 + pos2,pos0 + pos1 + pos2,pos2,pos2 + pos3,pos3)。任何人都可以给我一个轻推吗?在我睡了一个小时之前,我会更多地考虑这个问题并在早上给它做一个新鲜的工作......也许我的大脑需要充电。

再说一遍,我对此真的很陌生,如果我犯了一些非常愚蠢的错误请告诉我,我会向他们学习。谢谢!

2 个答案:

答案 0 :(得分:2)

你的算法存在缺陷。您的功能只向前迈出了一步。 您需要在内部添加循环以查看所有其余值。

function ArrayAdditionI(arr) {
    // sorting the array to easily remove the biggest value
    // slice added to prevent original array modification
    var sArr = arr.slice().sort(function (a, b) { 
        return a - b;
    });
    // removing the biggest value
    var biggest = sArr.pop();
    function recursion(start, i) {
        var result = false;
        // looking over all rest values of array
        for (var j = i; j < sArr.length && !result; j++) {
            if (sArr[j] + start === biggest) {
                result = true;
            }
            else if (start + sArr[j] < biggest) {
                result = recursion(start + sArr[j], j + 1);
            }
        }
        return result;
    }
    return recursion(0, 0);
}

答案 1 :(得分:1)

function ArrayAdditionI (arr) {
    var sArr = arr.sort(function (a,b) {
        return a-b;
    });
    var biggest = sArr.pop();
    function recursion (start, indx) {
        if (start + sArr[indx] === biggest) {
            return true;
        }
        else if (sArr.length < indx) {
            return false;
        }
        else if (start + sArr[indx] < biggest) {
            return recursion(start + sArr[indx], indx + 1) || recursion(start, indx+1)
        }
        else {
            return false;
        }
    }
    return recursion(0,0);
}