Это программа, которую я написал для решения проблемы. Проверьте, существует ли сумма элементов, равная максимальному числу в массиве, верните 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.
Возможно, проблема связана с несколькими вызовами? Я использую рекурсию ненадлежащим образом?
В чем вопрос? Как не использовать глобальное? Как лучше решить проблему? –
Сторона примечания: не используйте строки для булевых элементов. Используйте логические значения для булевых элементов. :-) Например, 'found = false' (не' found = "false" '),' found = true' (не 'found =" true "'), 'if (found)' (не 'if (found = = "true"))) –
Мой вопрос: почему я получаю undefined, если я использую оператор return в инструкции if. Кроме того, я попытался не использовать global и использовать return true, если sum === max и в самом конце возвращает false, он всегда возвращает false или undefined. – Maryam