JavaScript 如何编写简单的记忆化函数的代码
记忆化 是一种编程技术,用于加速函数的执行。当我们有一个耗时的函数时,它可以用来优化执行效率。它依赖于缓存对象的概念,缓存就是一个普通的对象。它减少了冗余的函数调用。
让我们来了解如何在JS中编写一个更简单的记忆化函数的代码。
示例1: 在这个例子中,我们将看到一种低效的编写函数的方式,它花费更多的时间计算。
Javascript
const square = (n) => {
let result = 0;
// Slow function
for (let i = 1; i <= n; i++) {
for (let j = 1; j <= n; j++) {
result += 1;
}
}
return result;
}
console.log(square(10000006));
console.log(square(40));
console.log(square(5));
输出:
出于这个原因,为了在较短的时间内处理大数据量的计算,我们使用记忆化技术。
有两种记忆化的方法:
- 函数记忆化
- 缓存记忆化
使用缓存记忆化来处理耗时较长的函数。
例子2: 这个例子用来计算一个数的平方。
JavaScript
const preValues = []
function square(n) {
if (preValues[n] != null) {
return preValues[n]
}
let result = 0;
for (let i = 1; i <= n; i++) {
for (let j = 1; j <= n; j++) {
result += 1;
}
}
// Storing precomputing value
preValues[n] = result;
return result;
}
console.log(square(50000));
console.log(square(5000));
console.log(square(500));
输出
2500000000
25000000
250000
使用缓存记忆化的动态规划。
示例3: 这个示例用于打印斐波那契数列。
Javascript
fib = (n, preValues = []) => {
if (preValues[n] != null)
return preValues[n];
let result;
if (n <= 2)
result = 1;
else
result = fib(n - 1, preValues) + fib(n - 2, preValues);
preValues[n] = result;
return result;
}
console.log(fib(100));
输出
354224848179262000000
使用记忆化,即给定一个函数,需要返回一个函数。
例子4: 这个例子展示了JavaScript中的记忆化。
Javascript
// Memoizer
const memoize = () => {
// Create cache for results
// Empty objects
const results = {};
// Return function which takes
// any number of arguments
return (...args) => {
// Create key for cache
const argsKey = JSON.stringify(args);
// Only execute func if no cached val
// If results object does not have
// anything to argsKey position
if (!results[argsKey]) {
results[argsKey] = func(...args)
}
return results[argsKey];
};
};
// Wrapping memoization function
const multiply = memoize((num1, num2) => {
let total = 0;
for (let i = 0; i < num1; i++) {
for (let j = 0; j < num1; j++) {
// Calculating square
total += 1 *;
}
}
// Multiplying square with num2
return total * num2;
});
console.log(multiply(500, 5000));
输出:
1250000000