递归太慢怎么优化?(使用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

猜你喜欢

转载自blog.csdn.net/z1783883121/article/details/124606136