Не получается найти сумму аргументов функции с помощью рекурсии.
если передан массив, то понял как это делается (уже была такая тема здесь),если без рекурсии, то тоже не возникает проблем.
пробую передать пар-ры через спред оператор, но выдает ошибку.
подскажите, что делаю не так?
let sum = 0;
let i = 0;
function summ(...arr) {
if (arr.length !== i) {
sum = sum + summ(arr[i])
i++;
return sum
} else return sum
}
В этой имплементации проблема в том, что ты сначала делаешь рекурсивный вызов, а в следующей строке - инкремент. Но рекурсия никогда до него не доходит. Чтобы все взлетело, нужно условия выхода тоже передавать в рекурсию.
Если хочешь инкрементом, то можно что-нибудь такое:
function summ (...args) {
function add (i, sum) {
// условие выхода - дошли до конца массива. Вернули sum
// сложили sum с текущим элементом массива
// рекурсивный вызов add с i+1 и суммой из предыдущей строки
}
return add(0, 0);
}
через инкремент пробовал, потому что видел подобный пример на форуме, ничего другого и не придумал. немного не понятно, то есть вся рекурсия будет выполнятся в функции add? а в summ просто передаются входящие пар-ры?
Да, в этом случае вся рекурсия в add. Но опять же - способов сделать это существует больше одного. Можно манипулировать самими аргументами (так ты обойдешься без внутренней функции):
Проверяешь, что количество аргументов <= 1. Если true, возвращаешь args[0]
Вынимаешь два элемента массива const sum = args.pop() + args.pop();
Добавляешь sum в массив args.push(sum);
Возвращаешь вызов summ с тем же ...args (только теперь там вместо последних двух элементов находится их сумма).
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 элемент массиве. Это и будет сумма.