Javascript数组添加 - 所有组合

时间:2015-02-03 05:07:14

标签: javascript arrays

我正在解决Coderbyte的阵列添加问题:

  

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

我已经提出了下面的解决方案,但由于某种原因,无法让递归工作。代码正确地标识了其余(非最大)数组元素与最大数组完全相加但仍然失败的数组。有什么建议吗?

function ArrayAdditionI(arr) { 
  arr = arr.sort(function(a,b) {return b-a});
  match = false;
  largest = arr.shift(arr[0]); 

  function test(a){
    if(eval(a.join("+"))==largest){
      match = true;
      return match}
    else {
      for(i = 0; i < a.length; i++){
        newArr = a.slice();
        newArr.splice(i,1);
        return test(newArr);
      }
    }
  }

  test(arr);
  return match;


}

2 个答案:

答案 0 :(得分:1)

eval是邪恶的。几乎在所有情况下,都可以在没有eval的情况下完成,并且它会更快,也可能更安全。您的

eval(a.join("+"))

可以写成

a.reduce(function(a, b) { return a + b; })

现在已经不在了:您的递归有效。你的循环没有。在循环的第一次传递中,您已经返回结果,因此每次递归中循环的第二次,第三次等迭代都不会发生。

这是您的代码稍作修改:

&#13;
&#13;
function ArrayAdditionI(arr) { 
  arr.sort(function(a,b) {return b-a;});
  var largest = arr.shift(); 

  function test(a) {
    var sum = a.reduce(function(a, b) { return a + b; }, 0);
    if (sum == largest) {
      return true;
    } else {
      for (var i = 0; i < a.length; i++) {
        var newArr = a.slice();
        newArr.splice(i,1);
        if (test(newArr)) {
          return true;
        }
      }
      return false;
    }
  }

  return test(arr);
}
var result = ArrayAdditionI([4, 6, 23, 10, 1, 3]);
document.getElementById('result').textContent = result;
&#13;
<div id="result"></div>
&#13;
&#13;
&#13;

答案 1 :(得分:0)

您也可以通过分离两个函数并在for loop内检查test函数来执行此操作:

 function ArrayAdditionI(arr) { 
	  arr.sort(function(a,b) {return b-a;});
	  var largest = arr.shift(); 
	  return test(arr,largest);
	}
  function test(a,largest) {
	    if (eval(a.join("+")) == largest) {
	      return true;
	    } else {
	      for (var i = 0; i < a.length; i++) {
	        var newArr = a.slice();
	        newArr.splice(i,1);
	        if (test(newArr,largest)) {//check if test returns true then only return from this method otherwise the last line will return false after whole execution
	          return true;
	        }
	      }
	      return false;
	    }
	  }
	var ar=[4, 6, 23, 10, 1, 3];
	var result = ArrayAdditionI(ar);
	alert(result);