一种优化递归算法的方法(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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值