memoization是一种提高计算机程序执行速度的优化技术。通过存储大量计算函数的返回值,当再次使用结果时,不需要重新计算。相反,它是直接从缓存中获取的。JavaScript对象和数组对于这种优化非常方便。例如斐波那契数列(Fibonacci,前两项之和等于后一项的值),通常写成:constfibonacci=n=>{returnn<2?n:fibonacci(n-1)+fibonacci(n-2);};for(leti=0;i<=10;i++){console.log(i+':'+fibonacci(i));};这样实现的方法做了很多重复,结果斐波那契函数调用了453次,其中for循环调用了11次,自己调用了442次。如果引入记忆功能,可以大大减少计算量。Fibonaccimemoization的实现使用一个memo数组来存储计算结果:constfibonacci=function(){letmemo=[0,1];constfib=n=>{letresult=memo[n];if(typeofresult!=='number'){result=fib(n-1)+fib(n-2);备忘录[n]=结果;}返回结果;};返回fib;}();fibonacci函数被调用29次,其中for循环被调用11次,它调用自身18次以获取先前存储的结果。与传统方法相比,计算量大大减少。扩展:具有记忆功能的构造函数我们可以概括上述技术并编写一个函数来构造具有记忆功能的函数。constmemoizer=(memo,formula)=>{constrecur=n=>{letresult=memo[n];if(typeofresult!=='number'){result=formula(recur,n);备忘录[n]=结果;}返回结果;};返回重复发生;};现在,您可以使用memoizer函数构造斐波那契函数,只需提供初始memo数组和公式函数:constfibonacci=memoizer([0,1],function(recur,n){returnrecur(n-1)+复发(n-2);});通过设计这个函数来产生另一个函数,我们的工作量可以大大减少。例如,要生成可记忆的阶乘函数,只需要提供基本的阶乘公式:constfactorial=memoizer([1,1],function(recur,n){returnn*recur(n-1);});引用自:《JavaScript语言精粹》
