递归太慢怎么优化?(使用memoization思路让你的代码性能提升一个级别)


前言

为什么需要优化递归这里不用说了吧!先看下面的示例:
在这里插入图片描述
相关代码:


/**
 * 使用递归实现计算斐波那契数列
 */
console.log("使用递归实现计算斐波那契数列");
console.time('start')
let count = 0;//用于统计总的使用次数
let fibonacci = function(n) {
  count++;
  return n < 2 ? n : fibonacci(n - 2) + fibonacci(n - 1);
}
fibonacci(40)
// 102334155
console.log(count);  
//331,160,280 !!!  由于每有缓存结果,每次都需要进行函数调用
console.timeEnd('start')



/**
 * 使用memoization思路之后 实现计算斐波那契数列
 */
console.log("\n使用memoization思路之后 实现计算斐波那契数列");
console.time('end')
let count2 = 0;//用于统计总的使用次数
const fibonacci2 = memoizer((recur, n) => {
  count2++
  return recur(n - 1) + recur(n - 2);
}, { "0": 0, "1": 1 });
fibonacci2(40)
console.log(count2);
// 39  可以看到最后通过 memoize 函数记忆,使得函数执行次数只需要39次,大大优化了函数执行计算的性能消耗,
console.timeEnd('end')


function memoizer(fundamental, cache){
  cache = cache || {}
  let shell = arg=>{
      if (! (arg in cache)){
          cache[arg] = fundamental(shell, arg)
      }
      return cache[arg];
  };
  return shell;
}

一、简单的实现方法

1.编写缓存函数(memoization)

//如:
/**
 * 
 * @param {function} fundamental 要执行的函数/方法
 * @param {*} cache //缓存对象 用于初始化第一个信息
 * @returns 
 */
function memoizer(fundamental, cache){
  cache = cache || {}
  const shell = arg=>{
      if (! (arg in cache)){
          cache[arg] = fundamental(shell, arg)
      }
      return cache[arg];
  };
  return shell;
}

2.调用该函数将要执行的函数及初始化信息传入

二、实现or优化原理

利用闭包原理,将函数参数作为对象的键(key),函数结果作为对象的 value 值,保存到对象当中。当使用时他会先去判断在缓存对象中是否有如果有就直接使用没有才重新调用生成


参考文档:
https://www.jianshu.com/p/765c4ff691a8

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

acqui~Zhang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值