zoukankan      html  css  js  c++  java
  • 函数记忆

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

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

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

     

  • 相关阅读:
    [LeetCode] Rotate Image
    [LeetCode] Generate Parentheses
    pandas 使用总结
    ConfigParser 读写配置文件
    Cheat Sheet pyspark RDD(PySpark 速查表)
    python随机生成字符
    grep 命令
    hadoop 日常使用记录
    python 2 计算字符串 余弦相似度
    screen命令
  • 原文地址:https://www.cnblogs.com/rookiehao/p/8350610.html
Copyright © 2011-2022 走看看