什么是函数记忆:函数记忆就是让函数记住处理过的参数和对应的处理结果。
使用函数记忆,就是为了避免重复计算,提高程序执行效率。
以判断一个数是否是质数为例。代码如下:
1 <!doctype html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>isPrime</title> 6 </head> 7 <body> 8 <script> 9 function isPrime(num){ 10 if(!isNan(num)&&num>1) { 11 if(n<=3) 12 return true; // 2,3 都为质数,可以直接return 13 else if(n%2==0) 14 return false; // 这一步能被2整除的不是质数 15 else{ 16 //循环进行模运算,最大到该数开平方根,减少运算次数 17 for(var i=3;i<Math.sqrt(num);i+=2){ 18 if(num%i==0) 19 return false; 20 } 21 //循环结束之后还没有被整除的数,说明是质数 22 return true; 23 } 24 }else{ 25 throw new Error("必须是大于1的数字") 26 } 27 } 28 </script> 29 </body> 30 </html> 31
上面的代码,只是实现了判断一个数是否为质数,并没有函数记忆的功能。 如下代码实现函数记忆功能:
1 <!doctype html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Clone</title> 6 </head> 7 <body> 8 <script> 9 var isPrime=(function(){ 10 var hash={}; //用于存储已经计算过的结果 11 return function(num){ 12 if(!isNaN(num)&&num>1){ 13 if(num<3) return true; 14 else if(num%2==0) return false 15 else if(hash[num]!==undefined) 16 //hash中存储过计算结果的数值,直接return 17 //不必再循环计算了,提高计算效率 18 return hash[num]; 19 else{ 20 for(var i=3;i<Math.sqrt(num);i++){ 21 if(num%i==0){ 22 //hash中没有的, 23 //计算完了之后将结果存入hash中, 24 //便于下次计算使用 25 hash[num]=false; 26 return false; 27 } 28 } 29 //hash中没有的, 30 //计算完了之后将结果存入hash中, 31 //便于下次计算使用 32 hash[num]=true; 33 return true; 34 } 35 }else{ 36 throw new Error("必须是大于1的数字") 37 } 38 } 39 })() 40 </script> 41 </body> 42 </html>
实现函数记忆的整体思路就是:将每次调用函数的结果保存在hash集合对象中。
下一次调用函数的时候,优先从hash中查找结果,hash中没有的才会进行计算,并把本次计算结果保存在集合中。