我试着用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
复制相似问题