#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.
Комментариев нет:
Отправить комментарий