Написать функцию sum(), которая будет работать как калькулятор
Подскажите, пожалуйста, как решается такая задача. (*из сборника задач на собеседование) Написать функцию sum(), которая будет работать как калькулятор
sum(1)() // 1
sum(1)(2)() // 3
sum(1)(2)(-1)() // 2
Для меня как бы очень смутил такой вариант вызова.
Ответы (2 шт):
Функция должна анализировать передаваемое значение и, если аргумент задан, возвращать новую функцию или, если передан undefined, возвращать результат
function sum(arg, res) {
if (arg === undefined)
return res;
res = (res || 0) + arg;
return function(arg) {
return sum(arg, res);
}
}
console.log(sum(1)()); // 1
console.log(sum(1)(2)()); // 3
console.log(sum(1)(2)(-1)()); // 2
Даже, во избежание ошибок, можно сделать функцию с одним аргументом
function sum(arg) {
const localSum = function(arg, res) {
if (arg === undefined)
return res;
res = (res || 0) + arg;
return function(arg) {
return localSum(arg, res);
}
}
return localSum(arg);
}
console.log(sum(1)()); // 1
console.log(sum(1)(2)()); // 3
console.log(sum(1)(2)(-1)()); // 2
function sum(arg, res = 0) {
return (arg === undefined) ? res : arg2 => sum(arg2, res + arg);
}
console.log(sum(1)()); // 1
console.log(sum(1)(2)()); // 3
console.log(sum(1)(2)(-1)()); // 2
еще более короткая запись
sum = (arg, res = 0) => arg === undefined ? res : arg2 => sum(arg2, res + arg);
Пояснение:
объявляем функцию как лямбда выражение, содержащее аргументы (в круглых скобках) -
arg- значение, с которым надо сложить полученный ранее результат,res- полученный ранее результат, и тело функции после символа=>, если тело занимает одну строчку, то не надо делатьreturnи писать фигурные скобкиsum = (arg, res = 0) =>второй аргумент
res(накопленный ранее результат) по умолчанию равен 0, т.е. если функция вызывается без второго аргумента, то он автоматически считается равным значению, указанному в скобках (т.е. в данном случае 0)основной алгоритм такой - если
argне определён, т.е. вызвана функцияsum(), то возвращается накопленный ранее результатres, иначе возвращается функция с накопленным ранее результатомв качестве функции с накопленным значением опять возвращаем лямбда-выражение
arg2 => sum(arg2, res + arg)
т.е. безымянную функцию у которой аргумент arg2, а тело - возврат значения функции sum в которой накоплен результат предыдущих вызовов res + arg