• JavaScript 缓存函数


    在我《惰性函数》一文引起一些争议,有人总是把惰性函数与缓存函数(Memoization)混为一谈。虽然都是缓存了结果,但最大的区别是一个改写函数本身,一个没有。那我就说一下缓存函数吧。简而言之,就是把上次运算的结果放到一个数组或对象中。

    拿什么做试验好呢?就拿那个Fibonacci数列吧,估计IE6会比较呛,一般5秒运算不了就假死了。我们先看消耗时间,再看结果。

    一直接用递归实现:

          function fib(n){
            if (n == 0 || n == 1)
              return 1;
            return fib(n-1) + fib(n-2);
          }
    

    再看缓存函数。国内也有许多实现,都集中在realazy的这篇贴子《JavaScript Memoization》中冒泡了!

     function Memoize(func, obj){
        var obj = obj || window,
            func = obj[func],
            cache = {};
        return function(){
            var key = Array.prototype.join.call(arguments, '_');//如果存在多个参数,如1,2,3,
            //则以1_2_3这样的字符串作为key,函数计算结果为value存于对象中
            if (!(key in cache))
                cache[key] = func.apply(obj, arguments);
            return cache[key];
        }
    }
    
    var fib = {
        fib: function(n){
             if (n == 0 || n == 1)
                 return 1;
            return this.fib(n-1) + this.fib(n-2);
        },
        fib_memo: function(n){
             if (n == 0 || n == 1)
                 return 1;
            return this.fib_memo(n-1) + this.fib_memo(n-2);
        }
    }
    
    fib.fib_memo = Memoize('fib_memo', fib);
    

    简化一下:反正只有一个参数,就改用数组吧。

          var memoize = function(fn) {
            var cache = [];
            return function(i) {
              return (i in cache) ? cache[i] :
                (cache[i] = fn.call(arguments.callee, i));
            };
          }
    
          var fib2 = new memoize(function(i) {
            if (i == 0 || i == 1)
              return 1;
            return this(i-1) + this(i-2);
          })
    

  • 相关阅读:
    RK3288 Android5.1系统编译
    RK3288 模块单独编译
    ubuntu 设置固定DNS
    PHP取整函数之ceil,floor,round,intval的区别
    PHP实现 APP端微信支付功能
    Laravel中服务提供者和门面模式
    laravel项目利用twemproxy部署redis集群的完整步骤
    PHP转盘抽奖算法
    laravel中短信发送验证码的实现方法
    PHP操作Redis常用
  • 原文地址:https://www.cnblogs.com/rubylouvre/p/1603131.html
Copyright © 2020-2023  润新知