2015-09-24 2 views
0

Это программа, которую я написал для решения проблемы. Проверьте, существует ли сумма элементов, равная максимальному числу в массиве, верните 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.

Кроме того, если я использую оператор return в следующем операторе if, код не работает должным образом.

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

Это не оптимальное решение проблемы, но это версия, в которой я работал.

Мой вопрос: почему я получаю undefined, если я использую оператор return в выражении if. Кроме того, я попытался не использовать 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]); false.

Оператор возврата между ** ** при удалении кода работает, иначе я либо получаю false, либо undefined. Я не понимаю эту часть! Почему удаление возврата решает проблему, я думал, что каждый рекурсивный вызов должен выполняться с помощью оператора return.

Возможно, проблема связана с несколькими вызовами? Я использую рекурсию ненадлежащим образом?

+3

В чем вопрос? Как не использовать глобальное? Как лучше решить проблему? –

+3

Сторона примечания: не используйте строки для булевых элементов. Используйте логические значения для булевых элементов. :-) Например, 'found = false' (не' found = "false" '),' found = true' (не 'found =" true "'), 'if (found)' (не 'if (found = = "true"))) –

+0

Мой вопрос: почему я получаю undefined, если я использую оператор return в инструкции if. Кроме того, я попытался не использовать global и использовать return true, если sum === max и в самом конце возвращает false, он всегда возвращает false или undefined. – Maryam

ответ

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); 
+0

Любая удача с этим? –

+0

@Maryam Пожалуйста, не забывайте об этом вопросе. Для меня потребовалось немало усилий, чтобы создать для вас рабочий пример. Когда у вас есть момент, нажмите зеленую галочку на вопросе, чтобы принять ответ. Это дает вам и мне дополнительные очки репутации. Заранее спасибо. –

0

В вашем коде есть несколько ошибок, которые могут привести к ошибке.

T.J. Crowder уже сказал, используйте фактические булевы вместо строки.

Переменная found не определена внутри вашей функции findSum. Это заставляет JavaScript предположить, что вы устанавливаете глобальную переменную. Добавить var found = false; в качестве самой первой строки вашей функции findSum.

Внутри последнего if внутри вашей for есть вызов функции findSum, но это не возвращает его значение и не присваиваем его переменной found.

Исправьте и обновите свой вопрос с результатами.

+0

Найдено глобальная переменная. Если я использую оператор return, я получаю undefined. Вышеприведенный код работает. Мне просто интересно, почему инструкции рекурсии и возврата не работают. Мне пришлось добавить глобальную переменную в качестве обходного пути. – Maryam

+0

Извините, я сдаюсь, пытаясь понять, как работает ваш код и что еще вы хотите. Иногда вы назначаете 'found' var, а иногда возвращаете значение. – gfpacheco

+0

Он определен на самом верху. var found = false. Есть две функции: добавление массива, которое вызывается первым и принимает массив как вход *, см. Последнюю строку *, а вторая функция находит сумму, которая проверяет, существует ли сумма. – Maryam

Смежные вопросы