我正在解决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;
}
答案 0 :(得分:1)
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;
&#13;
<div id="result"></div>
&#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);