Vad är Memoization
Memoization är en optimeringsteknik som påskyndar applikationer genom att lagra resultaten av dyra funktionssamtal och returnera det cachade resultatet när samma ingångar levereras igen.
låt oss ta ett exempel, Vi har den här metoden för att beräkna faktoriell av ett tal med hjälp av rekursion.
function recursiveFac(n) { if (n === 0) { return 1 } else { return n * recursiveFac(n - 1) }}
denna funktion fungerar bra men på lång sikt blir det dyrt. låt oss säga om det kallar första memoFac(7) och sedan memoFac(8), utan en cache för att lagra våra tidigare beräknade värden, måste vi upprepa hela processen och returnera funktionen ytterligare 7 gånger.
const cache = {}function memoFac(n) { if (cache) { return cache } else { if (n === 0) { cache = 1 } else { cache = n * memoFac(n - 1) } return cache}
så vi har en annan funktion memoFac() och global cache-objekt som lagrar resultatet för den nyckeln.
nu, om vi kallar memoFac (8) efter att vi har kallat memoFac(7), har vi redan sparat vårt beräknade värde för factorial(7) i vårt ”cache” – objekt, som har flyttats utanför funktionen för att behålla sina cachningsberäkningar. Således behöver vi bara ringa funktionen en gång, beräkna 8 * memoFac(7), som skickar oss direkt till vår ”cache” för att hämta det cachade värdet. Häftig!
men vänta — om memoisering följer samma allmänna format (hämtar värden från en cache i funktionens yttre omfattning eller beräknar värdet med funktionen anonym stängning), kunde vi inte skriva en allmän memoize-funktion? Ja det kan vi!
begreppet memoisering i JavaScript bygger huvudsakligen på två begrepp.
- stängningar
- funktioner med högre ordning
function memoizerHoc(fun){ let cache = {} return function (n){ if (cache != undefined ) { return cache } else { let result = fun(n) cache = result return result } }}
här har vi hoc-funktionen memoizerHoc () och en lokal variabel cache som kan vara tillgänglig inuti den returnerade funktionen (stängning).