我正在从JavaScript:The Good Parts一书中学习JavaScript,在memoization部分有一个关于使用memoize技术来做Fibonacci问题的例子
我们创建了一个通用的函数调用memoizer,它带有一个memo数组和基本函数,返回一个管理memo的shell函数并调用基本函数
var memoizer = function(memo, fundamental) {
var shell = function(n) {
var result = memo[n];
if (typeof result !== 'number') {
result = fundamental(shell, n);
memo[n] = result;
}
return result;
};
return shell;
};
然后像这样创建斐波那契:
var fibonacci = memoizer([0, 1], function(shell, n) {
return shell(n-1) + shell(n-2);
});
如果我运行fibonacci(10),结果将准确显示。
但令我困惑的是memoizer函数中的n参数shell函数。我知道这是我们想要计算的价值。但它来自哪里?例如,调用fibonacci(10)如何将值10传递给n?什么是var fibonacci?它是一个函数还是指向函数对象作为memoizer?
谢谢你的帮助!
因此,要充分理解这一点,您需要将以下内容理解为基本内容。
所以,现在看看代码。
var memoizer
被指定为一个返回内部另一个函数的函数。
var memoizer = function(memo, fundamental) {
var shell = function(n) {
... do some works ...
};
return shell;
};
你能看见它吗? var shell
在memoizer
的终点返回
无论memoizer
的内在逻辑是什么,它的结果都分配给了var fibonacci
var fibonacci = memoizer([0, 1], function(shell, n) {
return shell(n-1) + shell(n-2);
});
因此,这意味着fibonacci
等于memoizer
的结果(因为我们执行了它),而memoizer
的结果等于shell
函数。如果您阅读了我给您的链接,您可以了解幕后发生的事情。
顺便说一下,你给出的代码不是最好的方法。因为无论如何闭合使得激活的对象活着并不是必需的。
下面这段代码是制作斐波纳契的另一种方法,这不是绝对最好的方法,但是,我建议你将这段代码与你的代码进行比较,并找出差异。
var result = [];
result[0] = 1;
result[1] = 1;
function fibonacci(n){
var i;
for(i = 2; i < n; i++){
if(!result[i]){
result[i] = result[i-1] + result[i-2];
}
}
return result[i-1];
}
console.log(fibonacci(10));