JavaScript 从浅入深 100 题训练计划--(18)函数缓存(Memoization)
题目:实现一个 memoize 函数,缓存函数的计算结果
const fib = n => n <= 1 ? n : fib(n-1) + fib(n-2);
const memoizedFib = memoize(fib);
1 const fib = n => n <= 1 ? n : fib(n-1) + fib(n-2) 2 3 function memoize(fn, keyGenerator) { 4 const cache = new Map(); 5 6 return function(...args) { 7 // 生成缓存 key 8 const key = keyGenerator 9 ? keyGenerator(...args) 10 : JSON.stringify(args); 11 12 // 检查缓存 13 if (cache.has(key)) { 14 return cache.get(key); 15 } 16 17 // 计算并缓存结果 18 const result = fn.apply(this, args); 19 cache.set(key, result); 20 21 return result; 22 }; 23 } 24 25 const fibM = (function(){ 26 const cache = new Map(); 27 28 function fn(n){ 29 if(n < 1) return n; 30 if(cache.has(n)) return cache.get(n) 31 32 const result = fn(n - 1) +fn(n -2) 33 cache.set(n,result) 34 } 35 36 return fn 37 })(); 38 39 40 console.time('Without memoization'); 41 fib(40); // 非常慢 42 console.timeEnd('Without memoization'); 43 44 const memoizedFib = memoize(fib); 45 console.time('With memoization'); 46 memoizedFib(40); // -- 实际也很慢 47 console.timeEnd('With memoization'); 48 49 console.time('With fibM'); 50 fibM(40); // 很快 51 console.timeEnd('With fibM');

浙公网安备 33010602011771号