0

嗨,我是一个尝试学习递归的初学者。我正在尝试在 ArrayAdditionI(arr) 中编写一个关于组合算法的函数,如果 arr 包含 [4, 6, 23, 10, 1, 3] 输出应该返回 true,因为 4 + 6 + 10 + 3 = 23. 23 是数组中的最大数。如果没有组合给出 23,则函数返回 false。

在我的代码中,我尝试使用 return 但没有用,然后我将其更改为使其正常工作。我理解为什么 throw 有效,但很困惑为什么 return 无效。

这是我在 js 中运行的代码:

function ArrayAdditionI(arr) { 

//remove the maximal number from arr

var m = arr[0];
for (var i=0; i<arr.length-1;i++)
m =  Number(arr[i]) > Number(arr[i+1]) ? arr[i]:arr[i+1];
arr.splice(arr.indexOf(m),arr.indexOf(m));

//Here the recursion starts:

var combiAdd = function (a){
  var sum = 0;   
  for (var j=0; j<a.length;j++){
    sum += a[j];
    if (sum == m)
      throw true;
    else if (sum != m && j==a.length-1){
      if (a.length == 1)
        throw false;//switch to the "return false;"
      else
        combiAdd(a.splice(1,a.length));//switch to "return combiAdd(a.splice(1,a.length));
    }
  }        
}    

try {
    combiAdd(arr);
  }
catch(exp){
if (exp !=true && exp!=false)
  throw exp;
else 
  return exp;}
}

这是我的代码,返回不起作用:

//...same code as above
    if (a.length == 1) //same code
      return false;
    else
      return combiAdd(a.splice(1,a.length));

对于像 [4, 7, 10, 1] 这样的所谓错误数组,它给了我未定义的消息

谁能帮我?谢谢!

4

1 回答 1

0

你可以简化你的代码。

function ArrayAdditionI(arr) {
    var sum = 0, max;

    // remove the biggest number
    // and put the max number in a variable
    max = arr.splice( arr.indexOf( Math.max.apply(null, arr) ), 1)[0];

    // add the remaining numbers
    sum = arr.reduce(function (a, b) { return a + b; });

    return sum === max;
}
于 2013-08-06T01:05:25.693 回答