Qué es la memoización
La memoización es una técnica de optimización que acelera las aplicaciones almacenando los resultados de costosas llamadas a funciones y devolviendo el resultado almacenado en caché cuando se vuelven a suministrar las mismas entradas.
Tomemos un ejemplo, tenemos este método para calcular factorial de un número usando recursión.
function recursiveFac(n) { if (n === 0) { return 1 } else { return n * recursiveFac(n - 1) }}
Esta función funcionará bien, pero a largo plazo, será costosa. digamos que si llama primero a memoFac (7) y luego a memoFac(8), sin una caché para almacenar nuestros valores calculados previamente, tenemos que repetir todo el proceso, devolviendo la función otras 7 veces.
const cache = {}function memoFac(n) { if (cache) { return cache } else { if (n === 0) { cache = 1 } else { cache = n * memoFac(n - 1) } return cache}
Así que tenemos otra función memoFac () y un objeto de caché global que almacenará el resultado de esa clave.
Ahora, si llamamos a memoFac(8) después de llamar a memoFac(7), ya hemos guardado nuestro valor calculado para factorial(7) en nuestro objeto «cache», que se ha movido fuera de la función para retener sus cálculos de almacenamiento en caché. Por lo tanto, solo necesitamos llamar a la función una vez, calcular 8 * memoFac(7), que nos envía directamente a nuestra «caché» para recuperar el valor almacenado en caché. ¡Órale!
Pero espere, si la memoización sigue el mismo formato general (recuperar valores de una caché en el ámbito externo de la función, o calcular el valor utilizando la función de cierre anónimo), ¿no podríamos escribir una función de memoize general? ¡Sí podemos!
El concepto de memoización en JavaScript se basa principalmente en dos conceptos.
- Cierres
- Funciones de Orden Superior
function memoizerHoc(fun){ let cache = {} return function (n){ if (cache != undefined ) { return cache } else { let result = fun(n) cache = result return result } }}
Aquí tenemos la función ESPECIAL memoizerHoc () y una caché de variables locales a la que se puede acceder dentro de la función devuelta (closure).