JS函数式编程之--函数记忆

原创 2018年04月16日 15:03:38

处理一件事物,有些是过程中已经运算好的,可以将它们存储起来,以便于之后的直接使用。

相信大家都知道阶乘:

n! = n*(n-1)!
n! = n*(n-1)*(n-2)!
...
n! = n*(n-1)*(n-2)*...*1;

阶乘封装成函数:

function factorial1(n){
  if(n === 0 || n === 1){
   return 1;  //函数出口
  }
  return n*factorial1(n-1)
}

接着来看实际的执行次数:

var count = 0;
function factorial2(n){
  count ++;
  if(n === 0 || n ===1){
    return 1;
  }
  return n*factorial2(n-1);
}
for(var i = 1; i <= 5; i++){
  console.log(factorial2(i));
}
console.log(count);  //15,即执行15次
//解释:1! => 1次;2! => 2次;3! => 3次;4! => 4次;5! => 5次;每一次都要进行计算。====>改进方法:保存函数每次的执行结果

进行缓存,执行次数会减少:

var count = 0;
var cache = [];   //结果缓存数组
function factorial3(n){
  count ++;
  if(cache[n]){
    return cache[n];
  }else{
    if(n === 0 || n === 1){
      cache[0] = 1;
      cache[1] = 1;
      return 1;
    }else{
      cache[n] = n*factorial3(n-1);
      return cache[n];
    }
  }
}
for(var i = 1; i <= 5; i++){
  console.log(factorial3(i));
}
console.log(count);  //9,即执行9次
//解释:1! => 1次;2! => 2次;3! => 2次;4! => 2次;5! => 2次。
//【重点:计算的数值越大,时间节约越多】

将缓存数组私有,传入一个函数,使得传入的函数具有函数记忆功能:

//传入一个函数,使得传入的函数具有函数记忆的功能。
function memorize(fn){
  var cache = {};  //对象的查找速度比数组快,对象是key-value进行查找。
  return function() {
    var key = arguments.length + Array.prototype.join.call(arguments);  //使得key值唯一。
    if(cache[key]){
      return cache[key];
    }else{
      cache[key] = fn.apply(this, arguments);
      return cache[key];
    }
  }
}
var newF = memorize(factorial1);  //传入后,factorial就具有了函数记忆的功能。传入参数
newF(5);   //120



函数式编程中的常用技巧

http://www.cnblogs.com/lurongkai/p/functional-programming-skills.html 在Closure、Haskell、Py...
  • zdy0_2004
  • zdy0_2004
  • 2015-11-23 21:16:19
  • 716

JavaScript中函数式编程的体现--map和reduce

这两个函数都在某种程度上体现了函数式编程的思想,即将函数作为传入另一个函数的参数。map()方法的调用者一般是个数组,参数是一个函数,称为callback,返回值是一个由原数组中每个元素执行给定cal...
  • Pwiling
  • Pwiling
  • 2016-07-08 13:09:08
  • 2192

JS:函数的记忆功能(闭包)

1.函数记忆: 让函数记住处理过的参数和处理结果2.函数记忆的作用: 为避免重复运算3.什么时候使用函数记忆 ? 只要一个函数可能反复计算相同的数据时4.如何使用? 使用闭包保存住曾经计算过的参数和...
  • qq_31164127
  • qq_31164127
  • 2017-06-01 14:29:18
  • 359

JS函数式编程基础(FP)

函数式编程 纯函数 柯里化 函数合成
  • sgm222
  • sgm222
  • 2017-04-09 17:40:09
  • 377

js 函数式编程 浅谈

js 函数式编程 函数式的思想, 就是不断地用已有函数, 来组合出新的函数。 函数式编程具有五个鲜明的特点: 1. 函数是"第一等公民" 指的是函数与其他数据类型一样,处于平等地位 2. 只用"...
  • u011700203
  • u011700203
  • 2015-08-01 22:16:48
  • 3057

JavaScript 函数式编程到底是个啥

随着大前端时代的到来,在产品开发过程中,前端所占业务比重越来越大、交互越来越重。传统的老夫拿起JQuery就是一把梭应付当下重交互页面已经十分乏力。于是乎有了Angular,React,Vue这些现代...
  • hj7jay
  • hj7jay
  • 2017-06-22 10:15:04
  • 896

让你的javascript函数拥有记忆功能,减少全局变量的使用

让你的javascript函数拥有记忆功能,减少全局变量的使用
  • aitangyong
  • aitangyong
  • 2014-11-13 13:32:30
  • 1392

JavaScript 轻量级函数式编程

  • 2017年11月03日 19:11
  • 598KB
  • 下载

编写高质量代码:改善JavaScript程序建议--函数式编程

函数式编程已经在实际应用中经发挥了巨大作用,更有越来越多的语言不断地加入对诸如闭包、匿名函数等的支持,从某种程度上来讲,函数式编程正在逐步同化命令式编程。 建议1:禁用Function构造函数使用Fu...
  • ligang2585116
  • ligang2585116
  • 2016-10-16 21:19:24
  • 1814
收藏助手
不良信息举报
您举报文章:JS函数式编程之--函数记忆
举报原因:
原因补充:

(最多只允许输入30个字)