javascript递归算法中返回或抛出的差异

javascript递归算法中返回或抛出的差异,javascript,recursion,Javascript,Recursion,嗨,我是一个试图学习递归的初学者。我试图在ArrayAdditionI(arr)中编写一个关于组合算法的函数,如果arr包含[4,6,23,10,1,3],那么输出应该返回true,因为4+6+10+3=23。23是数组中的最大数。如果没有组合给出23,则函数返回false 在我的代码中,我尝试使用return,但没有成功,然后我将其更改为抛出它。 我理解为什么扔起作用,但对为什么返回不起作用感到困惑 以下是我在js中的代码: function ArrayAdditionI(arr) { /

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

在我的代码中,我尝试使用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;}
}
它给了我一个未定义的消息,比如[4,7,10,1]


有人能帮我吗?谢谢大家!

您可以简化代码

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;
}

您确实有
返回combiAdd(a.splice(1,a.length))在实际代码中,而不仅仅是
combiAdd(a.splice(1,a.length)),对吗?最可能的错误似乎是您忘记输入
return
,但在编写StackOverflow帖子时,您记得返回值而不是
arr.splice(arr.indexOf(m),arr.indexOf(m))。第二个参数是元素计数,而不是元素索引。我知道,但他所做的太复杂了。有更好的方法学习递归。
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;
}