IT戦記

プログラミング、起業などについて書いているプログラマーのブログです😚

javascript でメモ化

Function.prototype.state = function() { return undefined };

force = function(v) {
  return typeof v == 'function' && v.length == 0 ? force(v()) : v;
};

memo = function(f, k, v) {
  var state = f.state;
  f.state = f.state(k) !== undefined ? state : function(a) { return a === k ? v : state(a) }
  return v;
};

memoise = function(f) {
  return function(k) {
    var v = f.state(k);
    return v !== undefined ? v : memo(f, k, force(f(k)))
  }
};

memoised_add = memoise(function(a) { return memoise(function(b) { return function() { return force(a) + force(b) } })});
force(memoised_add (1) (2)) // => 3
force(memoised_add (1) (3)) // => 4
  • 効率は悪いので実用的ではありません
  • 引数が文字列以外のオブジェクトでもメモ化してくれます
  • 関数のプロパティが状態を持っているので純粋ではありません。