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');

 

posted @ 2026-08-29 15:25  小新的蜡笔  阅读(2)  评论(0)    收藏  举报