一种优化递归算法的方法(javascript)

Posted sq-blogs

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一种优化递归算法的方法(javascript)相关的知识,希望对你有一定的参考价值。

看书的时候看到了这个比较酷的方法,分享一下。

一、问题描述:代码如下,我们以计算阶乘(factorial)为例,当重复调用factorial(9),factorial(8),factorial(7)的时候,显然在factorial(9)已经计算了后面两个的值,factorial(8)和factorial(7)算是重复计算。目标就是对此进行优化。

function factorial(n) {
  if (n === 0) {
    return 1
  } else {
    return n * factorial(n - 1)
  }
}
console.log(factorial(9))
console.log(factorial(8))
console.log(factorial(7))

二、优化方法:主体原理是将计算结果在函数内部缓存起来,后面的重复计算直接取缓存。

初步优化代码如下:

function memfactorial(n) {
  // 进行缓存
  if (!memfactorial.cache) {
    memfactorial.cache = {
      ‘0‘: 1,
      ‘1‘: 1,
    }
  }
  // 进行计算
  if (!memfactorial.cache.hasOwnProperty(n)) {
    memfactorial.cache[n] = n * memfactorial(n - 1)
  }
  return memfactorial.cache[n]
}
console.log(memfactorial(9))
console.log(memfactorial(8))
console.log(memfactorial(7))

改进:可是这样不够通用,在计算其他递归算法的时候,希望也能用这个函数,我们将其封装为通用函数。代码如下:

function memoize(fundmental, cache) { 
  cache = cache || {}
  var shell = function (arg) {
    if (!cache.hasOwnProperty(arg)) {
      cache[arg] = fundmental(arg)
    }
    return cache[arg]
  }
  return shell
}

// 缓存该阶乘函数
var memfactorial = memoize(factorial, { ‘0‘: 1, ‘1‘: 1 })

console.log(memfactorial(9))
console.log(memfactorial(8))
console.log(memfactorial(7))

方法来源于:《高性能javascript》--Nicholas C.Zakas

以上是关于一种优化递归算法的方法(javascript)的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript数据结构与算法 - 递归

JavaScript中 BOM操作方法以及递归算法案例

算法笔记----递归算法

八皇后回溯计算法研究

算法漫游指北(第十篇):泛型递归递归代码模板递归思维要点分治算法回溯算法

[Java 8] Lambda表达式对递归的优化(上) - 使用尾递归 .