Страницы

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

вторник, 31 декабря 2019 г.

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

#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.

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

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