Skip to content
陈广亮的技术博客
Go back

JS 性能优化:记忆(memoization)

函数可以将先前操作的结果记录在某个对象里,从而避免无谓的重复运算。

普通阶乘

function factorial(n) {
  if (n == 0) return 1;
  return n * factorial(n - 1);
}

for (var i = 0; i < 10; i++) {
  factorial(i); // 共运行 55 次
}

带记忆的阶乘

var factorial = (function () {
  var cache = [1];
  var fac = function (n) {
    if (!cache.hasOwnProperty(n)) {
      cache[n] = n * fac(n - 1);
    }
    return cache[n];
  };
  return fac;
})();
// 共运行 19 次,直接调用 10 次 + 自调用 9 次

通用 memoizer

var memoizer = function (cache, fn) {
  cache = cache || [];
  var recur = function (n) {
    if (!cache.hasOwnProperty(n)) {
      cache[n] = fn(recur, n);
    }
    return cache[n];
  };
  return recur;
};

// 阶乘
var factorial = memoizer([1, 1], function (recur, n) {
  return n * recur(n - 1);
});

// 斐波那契
var fibonacci = memoizer([0, 1], function (recur, n) {
  return recur(n - 1) + recur(n - 2);
});

Share this post on:

Previous Post
一个有趣的 for 循环用法
Next Post
JS 函数返回值与 new 操作符