前言:锻炼自己的思想,规范自己的编程思路。
问题:
请你编写一个函数,它接收另一个函数作为输入,并返回该函数的 记忆化 后的结果。
记忆函数 是一个对于相同的输入永远不会被调用两次的函数。相反,它将返回一个缓存值。
你可以假设有 3 个可能的输入函数:sum 、fib 和 factorial 。
sum 接收两个整型参数 a 和 b ,并返回 a + b 。 fib 接收一个整型参数 n ,如果 n <= 1 则返回 1,否则返回 fib (n - 1) + fib (n - 2)。 factorial 接收一个整型参数 n ,如果 n <= 1 则返回 1 ,否则返回 factorial(n - 1) * n 。
示例:
输入:
"sum"
["call","call","getCallCount","call","getCallCount"]
[[2,2],[2,2],[],[1,2],[]]
输出:
[4,4,1,3,2]
思路:
这个 memoize 函数创建了一个缓存对象来存储先前函数调用的结果。当返回的函数使用一组参数调用时,它会检查这些参数的结果是否已经在缓存中。如果是,则返回缓存的结果。如果不是,则使用这些参数调用原始函数,将结果存储在缓存中,并返回结果。
基于上述思考,代码如下:
/**
* @param {Function} fn
*/
function memoize(func) {
const cache = {};
return function(...args) {
const key = JSON.stringify(args);
if (cache[key] === undefined) {
cache[key] = func.apply(null, args);
}
return cache[key];
};
}
执行结果如下图:
结论:
1.这个题目可以帮助我们学习如何使用记忆化来优化函数的性能。记忆化是一种优化技术,它通过存储昂贵函数调用的结果来加速计算机程序,并在再次发生相同的输入时返回缓存的结果。这种技术在递归算法中特别有用,因为它可以避免重复计算相同的子问题。
2.这个题目还可以帮助我们学习如何编写高阶函数。高阶函数是一种接收函数作为参数或返回函数的函数。在这个例子中,memoize 函数就是一个高阶函数,因为它接收一个函数作为输入并返回该函数的记忆化版本。
总之,这个题目可以帮助我们学习如何使用记忆化和高阶函数来优化和抽象代码。