【发布时间】:2017-12-04 10:07:47
【问题描述】:
我正在从 JavaScript: The Good Parts 一书中学习 JavaScript,在 memoization 部分有一个关于使用 memoize 技术解决斐波那契问题的示例
我们创建一个通用函数调用memoizer,它接受一个备忘录数组和基本函数,返回一个管理备忘录并调用基本函数的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指向函数对象?
感谢您的帮助!
【问题讨论】:
-
fibonacci是一个由memoizer返回的函数。 -
你的意思是
fibonacci是shell返回的函数memoizer?那么我们传给fibonacci的值也传给了shell函数中的n? -
fibonacci的参数或shell的参数被传递给fundamental回调 -
顺便说一句:fib(100) 354224848179262000000 的天真实现返回,尽管正确的值是 354224848179261915075。浮点数对于计算斐波那契数来说非常次优。如果数字类型甚至不能处理很小的值,那么记忆化的好处,即能够计算出真正的大数字,就已经过时了。