Подскажите, пож-та, как правильно написать функцию (чистую), которая считает сумму элементов массива рекурсивно.
Это мой вариант, выдает undefined, код неверный, не работает.
function Sum(arr) {
if ( arr.length == 0 ) {
return 0;
return arr[0] + Sum(arr.slice(1));
}
}
alert(Sum(arr));
Элементы решения в коде есть, но стоят они не на своих местах.
return работает так что он прерывает выполнение функции, и выражения со следующей строки не выполняются. Понимая эту механику, становится понятна бесполезность второй строки после первой с return.
Но не эта механика является причиной наблюдаемого undefined результата.
return 0;
return arr[0] + Sum(arr.slice(1));
undefined это то значение которое функция возвращает если в ее теле не выполнился явный return. Именно эта механика и дает наблюдаемый тобой результат: условие arr.length == 0 в твоем коде всегда false, интерпретатор не выполняет инструкции обернутые if-ом. А после if-a нет ни одной инструкции и функция возвращает undefined.
Вот к чему ты стремишься:
function Sum(arr) {
// условие выхода из рекурсии
if ( arr.length == 0 ) {
return 0;
} else {
// шаг рекурсии: взять первый элемент массива и сплюсовать с результатом суммы остальных элементов массива
return arr[0] + Sum(arr.slice(1));
}
}
alert(Sum([1,2,3,4,5,6,7,8,9]));
Спасибо большое за замечания, понятно. Такой вопрос: если взять сложный массив, с разными вложенными в него массивами и просто числами, такая функция выводит в алерт этот массив без суммы элементов этого массива. Как здесь быть?
У тебя уже есть элементы решения, и это тот случай (который не будет повторяться часто) когда решение не нужно переделывать, а можно достраивать.
Алгоритм умеет обрабатывать массив чисел, нужно добавить логику обработки вложенного массива. Модифицируй рабочий вариант что я кинул. Добавь до рекурсивного алгоритма ветку условия что делать если элемент массив (а не число как сейчас неявно подразумевается в решении).
Прелесть запуска рекурсий по массивам в том что про них можно думать так: я могу использовать рекурсивную функцию (в том числе внутри себя) если я определю внутри нее точку выхода и способ обработки всех интересующих меня случаев элементов массива.
И на случай если все эта тема чувствуется непонятой: рекурсия, особенно когда сталкиваешься с ней впервые, далеко не сразу “ложиться” в мозг. Нужно время, при том потраченное на продумывание и представление работы рекурсий, чтение альернативных описаний, работа по шагам с алгоритмом на бумажке.
function sumOfNumbers(arr) {
let sum = 0
arr.forEach(item => {
if (typeof item === 'number') {
sum += item;
} else if (Array.isArray(item)) {
sum += sumOfNumbers(item);
}
});
return sum;