函数记忆

什么是函数记忆:函数记忆就是让函数记住处理过的参数和对应的处理结果。

使用函数记忆,就是为了避免重复计算,提高程序执行效率。
以判断一个数是否是质数为例。代码如下:

 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中没有的才会进行计算,并把本次计算结果保存在集合中。

 

原文地址:https://www.cnblogs.com/rookiehao/p/8350610.html