#javascript
Как разработать функцию ( аналог 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));
Но боюсь нужно иначе реализовать((
Ответы
Ответ 1
Мемоизация - это сохранение уже вычисленных значений. Когда функция повторно вызывается с теми же аргументами, она должна вернуть готовое значение, не выполняя повторных вычислений. 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.
Комментариев нет:
Отправить комментарий