JavaScript Memoization

xiaoxiao2025-12-11  6

通过阅读网络上帖子: http://realazy.org/blog/2008/04/22/javascript-memoization/ 写下学习心得如下: “Memoization 原理非常简单,就是把函数的每次执行结果都放入一个散列表中,在接下来的执行中,在散列表中查找是否已经有相应执行过的值,如果有,直接返回该值,没有才 真正执行函数体的求值部分。很明显,找值,尤其是在散列中找值,比执行函数快多了。现代 JavaScript 的开发也已经大量使用这种技术。” 例如 fibonacci 函数; 可以写这样的函数: Function F(n){ if (n == 0 || n == 1) return 1; return F(n-1) + F(n-2); } F(5); 其计算过程如下: F(5)=F(4)+F(3); 计算F(4) 计算F(4) ,记得计算F(3) 和F(2) [color=blue] F(3)=F(2)+F(1); [/color][color=green]F(2)=F(1)+F(0);[/color] F(1), F(0) 各计算一次得出结果1;F(2)才得出结果2; 但是接着又计算了F(1); 这样一来就重复计算了F(1) 到了蓝这一步时,又重复计算了F(2);….. 如此在数值变得更大时,重复执行函数的就更多….. 现有如下方式计算: function kk(n){ if (n == 0 || n == 1) return 1; return gg(n-1) + gg(n-2); } gg = function (){ var cache = {}; return function(c){ var key = c; if (!(key in cache)) cache[key] = kk.call(null, c); return cache[key]; } }(); gg(4) 例如gg(2) 就不用再去循环计算…. 而直接返回 cache[2]为一个具体的数值; gg(3) 就不用再去循环计算…. 而直接返回 cache[3]为一个具体的数值; 当gg(30)这样的算式时,效果就非常明显,比F(30)块1000倍。 [b][color=red]找值,尤其是在散列中找值,比执行函数快多了。[/color][/b] 相关资源:JavaScript Memoization 让函数也有记忆功能
转载请注明原文地址: https://www.6miu.com/read-5040701.html

最新回复(0)