Страницы

Поиск по вопросам

пятница, 12 апреля 2019 г.

Как правильно понять задание с memoization

Как разработать функцию ( аналог 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

Комментариев нет:

Отправить комментарий