【发布时间】:2014-10-13 19:10:39
【问题描述】:
我正在尝试使用记忆来优化斐波那契函数的显式自递归实现。下面是一个相当标准的实现(一个简单且相当幼稚的实现,尽管它专注于实际问题)。
Function.prototype.memoize = function () {
var originalFunction = this,
slice = Array.prototype.slice;
cache = {};
return function () {
var key = slice.call(arguments);
if (key in cache) {
return cache[key];
} else {
return cache[key] = originalFunction.apply(this, key);
}
};
};
现在,当按如下方式创建和记忆函数时,它可以工作1。 (场景 1)
var fibonacci = function (n) {
return n === 0 || n === 1 ? n : fibonacci(n - 1) + fibonacci(n - 2);
}.memoize();
console.log(fibonacci(100));
但是,以下情况并非如此。2(场景 2)
var fibonacci = function (n) {
return n === 0 || n === 1 ? n : fibonacci(n - 1) + fibonacci(n - 2);
};
console.log(fibonacci.memoize()(100));
这也不是。2(场景 3)
function fibonacci(n) {
return n === 0 || n === 1 ? n : fibonacci(n - 1) + fibonacci(n - 2);
}
console.log(fibonacci.memoize()(100));
我的假设是,由于在函数上调用 memoize() 的方式不同,某些事情正在发生变化。请注意,这些功能在其他方面是相同的。我想这可能是因为除了第一个实例之外,只有第一个调用被记忆,而不是递归调用。
问题
如果我上面的假设确实是正确的,那么为什么会发生这种情况?谁能详细解释后两种情况与第一种情况有何不同?
1在这种情况下工作意味着返回第 100 个斐波那契数,因为只有使用记忆化才能递归地计算它。
2不工作就是让浏览器崩溃。
【问题讨论】:
-
更好的问题!
标签: javascript recursion memoization