Javascript数组添加 - 所有组合

Javascript array addition - all combinations

本文关键字:组合 数组 添加 Javascript      更新时间:2023-09-26

我正在解决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;

}

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

eval(a.join("+"))

可以写成

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

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

以下是稍作更改的代码:

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;
<div id="result"></div>

您也可以

通过将两个函数分开并在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);