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