函数变量更改时 Memoize 失败
Memoize fails when function variable changed
var fibo = function (x) {
console.log(x);
if (x === 1) return 1;
if (x === 2) return 2;
return fibo(x - 1) + fibo(x - 2);
};
// fibo = _.memoize(fibo);
var fibom = _.memoize(fibo);
console.log(fibom(5));
<script src="https://cdn.jsdelivr.net/lodash/4.17.2/lodash.min.js"></script>
为什么 memoize
在分配给原始函数变量名(如注释掉的代码中所示)时有效,但在分配给新变量时却无效?
当您将记忆函数分配给新变量时,递归调用仍将转到未记忆的版本。您需要像在注释掉的代码中那样覆盖引用。
这是因为递归函数正在调用原始的非记忆函数而不是记忆函数。
如果您 assign/override fibo
函数,原始函数内部的 fibo
调用将调用新的记忆函数,并且它有效。
var fibo = function (x) {
console.log(x);
if (x === 1) return 1;
if (x === 2) return 2;
return fibo(x - 1) + fibo(x - 2);
};
// fibo = _.memoize(fibo);
var fibom = _.memoize(fibo);
console.log(fibom(5));
<script src="https://cdn.jsdelivr.net/lodash/4.17.2/lodash.min.js"></script>
为什么 memoize
在分配给原始函数变量名(如注释掉的代码中所示)时有效,但在分配给新变量时却无效?
当您将记忆函数分配给新变量时,递归调用仍将转到未记忆的版本。您需要像在注释掉的代码中那样覆盖引用。
这是因为递归函数正在调用原始的非记忆函数而不是记忆函数。
如果您 assign/override fibo
函数,原始函数内部的 fibo
调用将调用新的记忆函数,并且它有效。