JavaScript 如何编写简单的记忆化函数的代码

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));

输出:

JavaScript 如何编写简单的记忆化函数的代码

出于这个原因,为了在较短的时间内处理大数据量的计算,我们使用记忆化技术。

有两种记忆化的方法:

  • 函数记忆化
  • 缓存记忆化

使用缓存记忆化来处理耗时较长的函数。

例子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

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程