Как разработать функцию ( аналог Math ) , которая выполняла простые математические операции (сложение, вычитание , умножение , деление) , а предыдущий рассчитанный результат кешировала ( меморизация , мемойз , memoization )
* Хорошо сделать мемойз каждого типа операции ( дилення, умножения ...) ?
Я сделал так(мемойз в моем понимании для сложения):
var sumRes, minusRes, multiRes, divRes;
var math = function(operation, op1, op2){
var result;
switch(operation){
case "+": sumRes = sumRes ? sumRes + op1 + op2: op1 + op2; result = sumRes; break;
case "-": minusRes = op1 - op2; result = minusRes; break;
case "*": multiRes = op1 * op2; result = multiRes; break;
case "/": divRes = op1 / op2; result = divRes; break;
default: console.log("The operation must to be only: \"+\", \"-\", \"*\", \"/\"");
}
return result;
};
console.log(math("+", 1, 2));
console.log(math("+", 1, 2));
console.log(math("+", 1, 2));
console.log(math("+", 1, 2));
Но боюсь нужно иначе реализовать((
Ответ
Мемоизация - это сохранение уже вычисленных значений. Когда функция повторно вызывается с теми же аргументами, она должна вернуть готовое значение, не выполняя повторных вычислений.
var calc = (function () {
var results = {};
var fs = {
'+': function (x, y) { console.log('calculation'); return x+y },
'-': function (x, y) { console.log('calculation'); return x-y },
'/': function (x, y) { console.log('calculation'); return x/y },
'*': function (x, y) { console.log('calculation'); return x*y }
};
return function calc(op, x, y) {
return results[x+op+y] = results[x+op+y] || fs[op](x,y);
}
})();
Естественно, console.log('calculation'); надо убрать - он здесь для демонстрации того, что вычисление происходит только единожды.
Самовызывающаяся функция нужна для того, чтобы сделать переменные results и fs приватными для функции calc
Комментариев нет:
Отправить комментарий