Рекурсией найти сумму элементов массива

Подскажите, пож-та, как правильно написать функцию (чистую), которая считает сумму элементов массива рекурсивно.
Это мой вариант, выдает 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]));

Спасибо большое за замечания, понятно. Такой вопрос: если взять сложный массив, с разными вложенными в него массивами и просто числами, такая функция выводит в алерт этот массив без суммы элементов этого массива. Как здесь быть?

Допустим, вот такого рода массив:
[ 5, 7,
[ 4, [2], 8, [1,3], 2 ],
[ 9, ],
1, 8 ]

У тебя уже есть элементы решения, и это тот случай (который не будет повторяться часто) когда решение не нужно переделывать, а можно достраивать.

Алгоритм умеет обрабатывать массив чисел, нужно добавить логику обработки вложенного массива. Модифицируй рабочий вариант что я кинул. Добавь до рекурсивного алгоритма ветку условия что делать если элемент массив (а не число как сейчас неявно подразумевается в решении).

Прелесть запуска рекурсий по массивам в том что про них можно думать так: я могу использовать рекурсивную функцию (в том числе внутри себя) если я определю внутри нее точку выхода и способ обработки всех интересующих меня случаев элементов массива.

И на случай если все эта тема чувствуется непонятой: рекурсия, особенно когда сталкиваешься с ней впервые, далеко не сразу “ложиться” в мозг. Нужно время, при том потраченное на продумывание и представление работы рекурсий, чтение альернативных описаний, работа по шагам с алгоритмом на бумажке.

Спасибо за помощь!

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;
1 лайк