递归退货声明

时间:2015-09-24 16:47:23

标签: javascript loops recursion return

这是我为解决问题而编写的程序。检查是否存在等于数组中最大数量的元素总和,如果是,则返回true,否则返回false。

var found = "false";
var max;

function ArrayAdditionI(array) { 

max = Math.max.apply(null,array);
var p = array.indexOf(max);

array.splice(p,1);
array.sort(function(a, b){return a-b;});


found = findSum(array, 0, 0);

return found;

}

function findSum(array, sum, startIndex){

for(var i = startIndex; i < array.length ; i++){

    sum += array[i]; 

    if(sum === max){
        found = "true";
        break;
    }else if(sum > max){
        break;
    }

     if(i+2 < array.length && sum < max){
         findSum(array, sum, i+2);
    }

}
    if(startIndex < array.length && sum !== max){
        return findSum(array, 0, startIndex+1);
    }

    return found;
}

ArrayAdditionI(readline());

我必须使用找到的全局变量来指示已找到和的位置。 return语句总是返回undefined。

此外,如果我在以下if语句中使用return语句,则代码无法正常工作。

if(i+2 < array.length && sum < max){
    return findSum(array, sum, i+2);
}

这不是问题的最佳解决方案,但这是我工作的版本。

我的问题是如果我在if语句中使用return语句,为什么我得到了未定义。另外,我尝试不使用global并使用return true如果sum === max并且在最后返回false,它总是返回false或undefined。

- 更新2:包含错误结果的代码 -

function ArrayAdditionI(array) { 
    var max = Math.max.apply(null,array);

    //remove max element from array
    var p = array.indexOf(max);
    array.splice(p,1);

    //sort array
    array.sort(function(a, b){return a-b;});

    //call find sum function
    return findSum(array, 0, 0, max);

}

function findSum(array, sum, startIndex){
    for(var i = startIndex; i < array.length ; i++){

        sum += array[i];

        if(sum === max){
            return true;
        }else if(sum > max){
            break;
        }

        if(i+2 < array.length && sum < max){
            **return** findSum(array, sum, i+2, max);
        }

    }
    if(startIndex < array.length && sum !== max){
        return findSum(array, 0, startIndex+1, max);
    }

    return false;
}

// calling the first function
ArrayAdditionI([  7, 2,90, 31, 50 ]);           

程序的开头是这个调用:ArrayAdditionI([7,2,90,31,50]); 回报应该是真的。 另外,ArrayAdditionI([1,2,3,4]);是真的。 但是,ArrayAdditionI([1,2,3,100]);是假的。

** **之间的return语句,当删除代码时,否则我得到错误或未定义。我不明白这一部分!为什么删除返回会解决问题,我认为每个递归调用都必须使用return语句进行。

问题可能是多次通话造成的?我是否以不正当的方式使用递归?

2 个答案:

答案 0 :(得分:0)

以下函数应该给出关于数组中值的任何组合是否产生最大数字的真或假答案。

    var a = [
        1, 1, 1, 1, 1, 1,
        1, 1, 1, 9
    ]
    var b = [1,1,1,5]
    function MembersHoldMaxSum(arr) {
        var i, r = false, index, max = Math.max.apply(null, arr), index;
        for (i = 0; i <= arr.length - 1; i++) {
            for (index = 0; index <= arr.length - 1; index++) {
                var new_arr = [], ct;
                for (ct = 0; ct <= arr.length - 1; ct++) {
                    if (index != ct) { new_arr.push(arr[ct]) }
                }
                while (new_arr.length != 1) {
                    var sum = 0, ct2 = 0;
                    for (ct2 = 0; ct2 <= new_arr.length - 1; ct2++) {
                        sum += new_arr[ct2];
                    }
                    if (sum == max) { return true }
                    new_arr.pop()
                }
            }
        }
        return r
    }
    var returns_true = MembersHoldMaxSum(a);
    var returns_false = MembersHoldMaxSum(b);

答案 1 :(得分:0)

您的代码可能会出现一些可能导致错误的错误。

T.J。克劳德已经说过,使用实际的布尔值而不是字符串。

found函数中未定义findSum变量。这使JavaScript假设您正在设置一个全局变量。 将var found = false;添加为findSum函数的第一行。

if内的最后for内,有一个findSum函数调用,但它没有返回它的值,也没有将它赋值给found变量。

修复这些内容并使用结果更新您的问题。