我正在阅读Javascript:The Good Parts这本书。我无法理解下面的代码:
我们可以通过制作一个来概括这一点 帮助我们记忆的功能 功能。记事本功能将 拿一个初始的备忘录数组和 基本功能。它返回一个 管理备忘录的shell函数 商店和那称之为根本 根据需要运作。我们通过了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; };
我们现在可以定义斐波那契了 memoizer,提供初始备忘录 数组和基本功能:
var fibonacci = memoizer([0, 1], function (test, n) { return test(n - 1) + test(n - 2); });
我的问题是什么是测试功能?什么时候定义和调用?这对我来说似乎很困惑。我也认为这句话:memo[n] = result;
没用。如果我错了,请纠正。
答案 0 :(得分:4)
这是一个有趣的代码片段:)
您可能知道memoization正在存储函数的结果,因此下次调用该函数时,它不必计算答案,它可以查找它。
因此我们需要存储带有int并返回int的fibonacci函数的答案。
var fibonacci = memoizer([0, 1], function (test, n) {
return test(n - 1) + test(n - 2);
});
使用初始备忘录数组调用memoizer,映射fib(0) - > 0和fib(1) - > 1.
其余的定义了一个带有函数和数字的未命名函数。 'test'是一个坏名字,它应该是“recursive_fibonacci_helper”:)
这个未命名的函数成为“基本”参数。 memoizer函数返回一个带有int参数的函数(shell)。这最终成为斐波纳契函数。
所以有人说“斐波那契(5)”。他们真的称之为“shell(5)”。关闭的重要部分是“基本”和“备忘录”已经受到约束。
那么'shell'会做什么?
它在备忘录表中查找它是否已经为此输入计算了答案。如果它看到答案(=='数字'),则返回它。否则计算它并将其存储在备忘录表中。 memo[n] = result
实际上是将计算结果存储在memoization表中。
答案 1 :(得分:1)
语句memo[n] = result;
将新计算的数字存储在memoization数组或缓存中。 test
函数是要记忆的函数的参数,由memoizer
定义和传递。调用时,它会检查要计算的值是否已被缓存。如果是这样,它将从缓存中返回它。否则它会再次重新计算。
执行完所有上述代码后,我们在内存中得到类似的内容(但memo
数组和orig_fibonacci
已封装):
var memo = [0, 1];
function fibonacci(n) {
var result = memo[n];
if (typeof result != 'number') {
result = orig_fibonacci(n);
memo[n] = result;
}
return result;
}
function orig_fibonacci(n) {
return fibonacci(n - 1) + fibonacci(n - 2);
}