我正在从“JavaScript JavaScript: Good Parts”一书中学习JavaScript,在回忆录部分中有一个关于使用回忆录技术解决斐波纳契问题的例子。
我们创建一个通用函数调用回忆器,它接受一个备忘录数组和基本函数,返回一个管理备忘录的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),结果将准确显示。
但让我困惑的是回忆录函数中的n参数shell函数。我知道这是我们想要计算的值。但它是从哪里来的?例如,如何调用fibonacci( 10 )可以将值10传递给n?法博纳契究竟是什么?它是函数还是指向函数对象作为回忆录?
谢谢你的帮助!
发布于 2017-12-04 10:54:06
因此,要完全理解这一点,你需要把下面的东西理解为基本的部分。
那么,现在看看代码。
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函数。如果你能很好地阅读我给你的链接,你就能理解幕后发生了什么。
顺便说一下,你给出的代码不是最好的方法。因为无论如何,闭包使激活的对象处于活动状态,这是不必要的。
下面的代码是另一种制作fibonacci的方法,--这不是绝对最好的方法,不过,我建议您将这段代码与您的代码进行比较,并找出不同之处。
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));
https://stackoverflow.com/questions/47630877
复制相似问题