试图返回一个递归组合函数而不会得到'undefined'

时间:2014-06-12 07:05:02

标签: javascript for-loop recursion combinations

当我用[1,2,3,4]调用它时,它返回undefined,我不明白为什么。如果数组中的任何数字组合加到数组中的最大数字,则目标是返回true,如果不可能,则返回false。

function ArrayAdditionI(arr) { 

  var max = Math.max.apply(null, arr);
  arr.splice(arr.indexOf(max), 1);
  var sum = function(arr) { return arr.reduce(function(a,b) { return a + b; }); };

  function combos(arr) {

    var f = function(prefix, arr) {
      for (var i = 0; i < arr.length; i++) {
        var clone = prefix.slice(0);
        clone.push(arr[i]);
        if (sum(clone) == max) { return true; }
        return f(clone, arr.slice(i+1));
      }
    }
    return f([], arr);
  }

  return combos(arr); 

}

3 个答案:

答案 0 :(得分:2)

f在使用空undefined调用时返回arr!如果循环中没有任何测试从函数返回,则需要显式return false。并且你不应该在第一次循环时return false,但只有当你找到true时才会中断并继续循环。

要解决此问题,您需要

function combos(arr) {
  function f(prefix, arr) {
    for (var i = 0; i < arr.length; i++) {
      var clone = prefix.slice(0);
      clone.push(arr[i]);
      if (sum(clone) == max) return true;
      if (f(clone, arr.slice(i+1))) return true;
    }
    return false;
  }
  return f([], arr);
}

然而,你的循环递归方案看起来有点复杂。我宁愿选择“二叉树”的天真枚举,其中每个级别的节点决定当前项目是否将包含在待测子集中:

function ArrayAdditionI(arr) { 
  var max = Math.max.apply(null, arr);
  arr.splice(arr.indexOf(max), 1);
  var sum = function(arr) { return arr.reduce(function(a,b) { return a + b; }, 0); };

  function f(subset, arr) {
     return arr.length 
          ? f(subset, arr.slice(1)) || f(subset.concat([arr[0]]), arr.slice(1))
          : sum(subset) == max
  }
  return f([], arr); 
}

答案 1 :(得分:0)

您似乎没有测试所有可能的组合。

在这里你将测试1 + 2 + 3 + 2 + 3,3但从不测试1 + 3.

你真的想在这里有一个递归函数吗? 可能有一些更简单的方法来找到它。

function ArrayAdditionI(arr) { 
    var max = Math.max.apply(null, arr);
    arr.splice(arr.indexOf(max), 1);

    var res = arr.filter(function(num, idx) {
        var combination = false;
        // Check all combination non previously tested
        for (var i = idx; i < arr.length - 1; i++) {
            if (num + arr[i+1] === max) {
                combination = true;
                break;
            }
        }
        return combination;
    });
    return res.length > 0;
}

答案 2 :(得分:0)

问题是你的f功能没有达到 if (sum(clone) == max) { return true; } 代码行,所以它只是保持递归调用,直到arr.length == 0,它将返回undefined。

您的变量torf和结果未使用,也许您忘了对它们做些什么?