本文介绍如何利用 JavaScript 的记忆函数(Memoization)技术解决递归计算中的重复运算问题。通过封装记忆逻辑,可显著降低时间复杂度,实现指数级速度提升,适用于斐波那契数列及阶乘等场景。
递归计算的重复运算问题
假设需要计算斐波那契数列(fibonacci)的值:
相关代码如下:
var fibonacci = function (n) {
return n < 2 ? n : fibonacci(n - 1) + fibonacci(n - 2);
}; 当输入数值较大时,浏览器可能会因运算过载而崩溃,原因在于递归过程中存在大量重复计算。然而,借助 JavaScript 强大的数组存储能力和函数闭包特性,我们可以轻松实现结果缓存(即记忆功能)。这将使运算速度获得指数级的提升。
记忆函数的实现与使用
以下是简洁且高效的记忆函数实现:
相关代码如下:
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);
}); 同理,若需计算阶乘(factorial)数列:
相关代码如下:
var factorial = memoizer([1, 1], function (shell, n) {
return n * shell(n - 1);
});