Hvad er Memoisering
Memoisering er en optimeringsteknik, der fremskynder applikationer ved at gemme resultaterne af dyre funktionsopkald og returnere det cachelagrede resultat, når de samme indgange leveres igen.
lad os tage et eksempel, Vi har denne metode til at beregne factorial af et tal ved hjælp af rekursion.
function recursiveFac(n) { if (n === 0) { return 1 } else { return n * recursiveFac(n - 1) }}
denne funktion fungerer fint, men i det lange løb vil det være dyrt. lad os sige, at hvis det først kalder memoFac(7) og derefter memoFac(8), uden en cache til at gemme vores tidligere beregnede værdier, er vi nødt til at gentage hele processen og returnere funktionen yderligere 7 gange.
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 anden funktion memoFac () og global cache objekt, som vil gemme resultatet for denne nøgle.
nu, hvis vi kalder memoFac (8), efter at vi har kaldt memoFac(7), har vi allerede gemt vores beregnede værdi for factorial(7) i Vores “cache” objekt, som er blevet flyttet uden for funktionen for at bevare sine caching beregninger. Således behøver vi kun at kalde funktionen en gang, beregne 8 * memoFac(7), som sender os direkte til vores “cache” for at hente den cachelagrede værdi. Fedt!
men vent – hvis memoisering følger det samme generelle format (henter værdier fra en cache i funktionens ydre omfang eller beregner værdien ved hjælp af den anonyme lukningsfunktion), kunne vi ikke skrive en generel memoeringsfunktion? Ja Vi kan!
begrebet memoisering i JavaScript er bygget majorly på to begreber.
- lukninger
- højere ordens funktioner
function memoizerHoc(fun){ let cache = {} return function (n){ if (cache != undefined ) { return cache } else { let result = fun(n) cache = result return result } }}
her har vi HOC-funktion memoiserhoc () og en lokal variabel cache, der kan være tilgængelig inde i den returnerede funktion (lukning).