Сумма параметров функции рекурсивно

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

пробую передать пар-ры через спред оператор, но выдает ошибку.
подскажите, что делаю не так?

    let sum = 0;
let i = 0;

function summ(...arr) {
    if (arr.length !== i) {
        sum = sum + summ(arr[i])
        i++;
        return sum
    } else return sum
}

summ(5,7,10,1,39)

В этой имплементации проблема в том, что ты сначала делаешь рекурсивный вызов, а в следующей строке - инкремент. Но рекурсия никогда до него не доходит. Чтобы все взлетело, нужно условия выхода тоже передавать в рекурсию.
Если хочешь инкрементом, то можно что-нибудь такое:

function summ (...args) {
	function add (i, sum) {
		// условие выхода - дошли до конца массива. Вернули sum
		// сложили sum с текущим элементом массива
		// рекурсивный вызов add с i+1 и суммой из предыдущей строки
	}

	return add(0, 0);
}
1 лайк

через инкремент пробовал, потому что видел подобный пример на форуме, ничего другого и не придумал. немного не понятно, то есть вся рекурсия будет выполнятся в функции add? а в summ просто передаются входящие пар-ры?

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

  1. Проверяешь, что количество аргументов <= 1. Если true, возвращаешь args[0]
  2. Вынимаешь два элемента массива const sum = args.pop() + args.pop();
  3. Добавляешь sum в массив args.push(sum);
  4. Возвращаешь вызов summ с тем же ...args (только теперь там вместо последних двух элементов находится их сумма).
1 лайк
function summ (...args) {
	if (args.length === 1) {
		return args[0]
	} else {
		const lastVal = args.pop()
		const preLastVal = args.pop()
		// args уже модифиуцированы, не содержат двух последних значений из-за .pop
		return summ(...args, lastVal + preLastVal)
	}
}

Показываю код потому что видно что ты работал над задачей.

Тут принцип построен на том что смотреть на последний элемент массива args как на чисто в коротое аккумулировать сумму. С этой перспективый для каждой последующей итерации рекурсии нужно взять последний элемент массива и сложить с предпоследним. До тех пор пока не остатется 1 элемент массиве. Это и будет сумма.

Всем привет!

Вставлю свои 5 копеек.
@Igor2 Я переделал твой вариант с рекурсией. Вот, что у меня получилось:

function calcSum(arr, currentSum = 0, i = 0) {
    if (arr.length !== i) {
        let nextSum = currentSum + arr[i];
        return calcSum(arr, nextSum, ++i);
    } else return currentSum;
}

function sum(...arr) {
    return calcSum(arr);
}

summ(5,7,10,1,39);
3 лайка