Ce document est principalement utilisé pour examen rétrospectif et d'approfondir la compréhension
- Tout d'abord, l'idée de la fonction récursive est très pratique dans la réalisation des fonctions, mais il est très performance des coûts, comme l'exemple suivant
// 递归求阶乘
function jieCheng_1(num) {
if (num <= 1) {
return 1; // 递归的出口
}
return num * jieCheng_1(num - 1); // 递归
}
-
Peut être trouvé par l'écriture récursive, quand num> 2, la valeur calculée du nombre de fois num factoriel factoriel appel de fonction est requise: Le nombre d'appels, la valeur factoriel d'un appel de fonction factorielles + num-1 calculs requis
-
Ainsi, nous pouvons concevoir un espace tampon pour la valeur calculée de la factoriel SAUVEGARDÉES, par exemple, nous avons calculé le num-1 factoriel, et il sera enregistré dans l'espace tampon lors du calcul du num factoriel, juste à partir du cache Lire la valeur factorielle num-1, et la multiplication et num est le résultat de calcul
// 递归求阶乘
var cache = {}; // 缓存区
function jieCheng_2(num) {
var cacheItem = cache[num];
if (cacheItem) {
return cacheItem;
} else {
return cache[num] = num <= 1 ? 1 : num * cache[num - 1];
}
}
- Nous continuons d'optimiser le cache peut être transformé en une caractéristique, l'utilisation de la privatisation de la fermeture de l'espace cache
/* 缓存函数 */
function memory(fn) {
var cache = {}; // 私有化缓存结构
return function () {
var key = arguments[0],
cacheItem = cache[key];
if (cacheItem) {
return cacheItem;
} else {
return cache[key] = fn.apply(this, arguments);
}
}
}
-
Nous avons comparé dans le même ordre de grandeur l'efficacité des trois fonctions suivantes
- jieCheng_1
- jieCheng_2
- memoryJieCheng
console.time(); jieCheng_1(10000); console.timeEnd(); console.time(); jieCheng_2(10000); console.timeEnd(); console.time(); memory(jieCheng_1)(10000); console.timeEnd();
- Mais attention: fermetures provoquent des fuites de mémoire (occupation), doit être mis en balance le coût du temps et le coût espace