JavaScript : rendre le Web interactif (école d'ingénieur) · Chapitre 4 · Exercice de TD
Mémoïser
Portée, fermetures et this · niveau 3 (difficile)
Énoncé
Le calcul des frais de port d'après le poids d'un colis est lent (il interroge un service extérieur). Écrire memoiser(fonction), qui renvoie une version de la fonction (à un argument) qui garde ses résultats dans un objet servant de cache : un second appel avec le même argument renvoie le résultat sans rappeler la fonction. Vérifier, en comptant les appels réels, qu'avec les appels frais(1200), frais(1200), frais(300), frais(1200), la fonction lente n'est appelée que deux fois.
Corrigé
function memoiser(fonction) {
const cache = {};
return (n) => {
if (!(n in cache)) {
cache[n] = fonction(n);
}
return cache[n];
};
}
let appels = 0;
function fraisLents(poids) {
appels++;
return 490 + 100 * Math.ceil(poids / 500);
}
const frais = memoiser(fraisLents);
console.log(frais(1200), frais(1200), frais(300), frais(1200));
console.log("appels réels :", appels);
790 790 590 790
appels réels : 2
L'objet cache, privé, associe à chaque argument déjà vu son résultat ; n in cache teste la présence de la clé (on ne teste pas cache[n], qui serait falsy pour un résultat égal à 0). Les clés d'un objet sont des chaînes : cette version ne convient qu'à des arguments simples, nombres ou chaînes. Le chapitre 5 présentera Map, qui accepte toute valeur comme clé.
100 % gratuit
La suite du chapitre est sur Adloun
- 10 autres exercices corrigés dans ce chapitre
- Les 2 QCM du chapitre, le premier sans compte
- Le tuteur, qui guide pas à pas sans donner la réponse
Sans compte : le cours et le premier QCM. Exercices et tuteur : inscription gratuite en 30 secondes, sans carte bancaire.