我试着用javascript实现回忆录。下面是代码:
function memoize(func) {
    var history = {}
    var inner = function(n) {
        if (n in history) {
            return history[n];
        }
        let result = func(n)
        history[n] = result;
        return result;
    }
    return inner;
}
function fib(n) {
    if (n <= 1) {
        return n;
    }
    return fib(n-1) + fib(n-2)
}
/*
fib = memoize(fib);
console.log(fib(20)) // O(n)
*/
/*
fib2 = memoize(fib);
console.log(fib2(20)) // O(2^n)
*/起作用了..。我可以用O(n)来计算值,但我失去了原来的函数。有没有办法让原来的fib函数还可以访问呢?谢谢
发布于 2022-01-07 03:27:20
如果要保留fib的原始未回忆录版本,则需要以某种方式修改fib,例如将递归函数作为参数传递。否则,递归fib调用将保留为函数的非回忆录版本。
例:
function memoize(func) { // potentially update this to accept as hash function to calculate the key for `history` to make this more generic
  var history = {}
  var inner = function(n, ...args) {
    if (n in history) {
      return history[n];
    }
    let result = func(n, ...args);
    history[n] = result;
    return result;
  }
  return inner;
}
function fib(n, recursiveFn = fib) {
  if (n <= 1) {
    return n;
  }
  return recursiveFn(n - 1, recursiveFn) + recursiveFn(n - 2, recursiveFn)
}
const fastFib = memoize(fib);
console.log(fastFib(40, fastFib)); // O(n)
const slowFib = fib(40); // O(2^n)
console.log(slowFib);
https://stackoverflow.com/questions/70616066
复制相似问题