JlA 10×90 Memoización: menos cálculos, más rapidez

La memoización es una forma sencilla de evitar que una función recursiva haga el mismo trabajo una y otra vez. En el ejemplo clásico de subir escaleras con saltos de uno, tres y cinco peldaños, la frase clave es memoización en Python, y sirve para ver muy bien por qué una caché puede cambiarlo todo.

La idea de partida es fácil de entender. Si queremos saber cuántas formas hay de llegar a un peldaño concreto, podemos sumar las formas de llegar desde los escalones anteriores válidos. Eso se traduce en una expresión del tipo f de n igual a f de n menos uno más f de n menos tres más f de n menos cinco. Pero claro, si no ponemos límites, la función se mete en un bucle infinito de llamadas. No es precisamente el sueño de ningún programa.

Para arreglarlo, necesitamos dos casos base. Si n es igual a cero, contamos un camino válido. Si n es menor que cero, devolvemos cero porque ese salto no existe. Con eso, la recursión ya tiene suelo y techo.

Aun así, queda el gran problema: repetir cálculos. La misma cuenta aparece muchas veces en ramas distintas del árbol de llamadas, así que el programa acaba trabajando de más. Ahí entra la caché. Guardamos los resultados ya calculados en un diccionario y, cuando el mismo valor vuelve a salir, lo devolvemos al instante. Sin drama y sin rehacer la tarea.

Lo interesante es que esta idea no se queda en un ejemplo cerrado. También podemos usar cualquier lista de saltos posibles en lugar de limitarnos a uno, tres y cinco. Y cuando comparan tiempos de ejecución, la diferencia es enorme: la versión memoizada resuelve casos mucho más grandes en una fracción de segundo.

Si queremos ver este concepto en acción, podemos convertir cada escalón en una pequeña partida: acertar el siguiente salto correcto nos da puntos y nos obliga a pensar qué caminos ya hemos usado. Luego aprendemos casi sin darnos cuenta. Visitemos JeiJoLand para seguir jugando con ideas que también nos hacen entender mejor la programación.