«

「1 秒变 1 毫秒」:教你用 JavaScript Memoization 优雅加速计算!

cola 发布于 阅读:80 JavaScript


什么是 Memoization?

Memoization(记忆化) ,又叫 函数记忆 ,是一种 缓存技术 。它的原理非常简单:

对相同的输入参数,只计算一次,把结果缓存下来。下次遇到一样的输入,直接取缓存,再也不用计算啦!


为什么 Memoization 这么香?


实战案例1:普通递归 VS Memoization 加速

先看最“慢”的写法

    function fib(n) {  
      if (n < 2) return n;  
      return fib(n - 1) + fib(n - 2);  
    }  
    console.time('plain');  
    console.log(fib(40)); // 慢到想骂人  
    console.timeEnd('plain');

优雅地 Memoize 一下

    function memoize(fn) {  
      const cache = {};  
      return function(...args) {  
        const key = args.join(',');  
        if (cache[key]) {  
          return cache[key];  
        }  
        const result = fn.apply(this, args);  
        cache[key] = result;  
        return result;  
      }  
    }  

    const memoizedFib = memoize(function fib(n) {  
      if (n < 2) return n;  
      return memoizedFib(n - 1) + memoizedFib(n - 2);  
    });  

    console.time('memoized');  
    console.log(memoizedFib(40)); // 秒出!  
    console.timeEnd('memoized');

你会发现,原来要跑几秒甚至更久的递归,memoize 一下就瞬间完成!