美文网首页
“函数记忆”

“函数记忆”

作者: Va_ | 来源:发表于2019-09-20 14:54 被阅读0次

在计算机领域,记忆(memoization)是主要用于加速程序计算的一种优化技术,它使得函数避免重复盐酸之前已被处理的输入,而返回已缓存的结果。
————摘自维基百科

函数可以将先前操作的结果记录在某个对象里,从而避免无谓的重复运算。JavaScript的对象和数组要实现这种优化是非常方便的,本文将实现一个递归函数,来计算Fibonacci(斐波那契数列)。

下列数组就是一个斐波那契数列,(前面相邻两项之和等于后一项的值)

[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55]

递归实现很简单,代码如下:

var fibonacci = function (n) {
  console.count('fibonacci被执行的次数:')
  return n < 2 ? n : fibonacci(n - 1) + fibonacci(n - 2)
}

document.body.innerHTML = fibonacci(10)

乍一看,一行代码搞定。但是会有些问题,这里用console.count计算了下fibonacci函数被执行的次数,结果显示:fibonacci被执行的次数: 177

可以看出它做了很多无用功,我们只调用了一次fibonacci函数,它自己却调用了自己176次。

我们可以利用闭包,使我们的函数具备记忆功能。在函数内部声明一个memory数组来储存结果,每次调用时,先判断需要的值是否存在,如果存在直接取就好了。

var fibonacci = function (n) {
  var memory = [0, 1];

  (function run(n) {
    console.count('run执行次数')
    var result = memory[n]

    if (typeof memory[n] !== 'number') {
      result = run(n - 1) + run(n - 2)
      memory[n] = result
      console.count('计算次数')
    }

    return result
  })(n)

  return memory[n]
}

document.body.innerHTML = fibonacci(10)

run执行次数: 19
计算次数: 9

控制台结果显示,计算次数显示只有9次!其余都是直接拿缓存的结果。我们可以多打印些日志,看下函数的入栈出栈顺序,加深理解。

var fibonacci = function (n) {
  var memory = [0, 1];

  (function run(n) {
    console.group('run') // 用group分组查看打印日志,很给力~

    console.log('memory[%d]: ', n, memory[n])
    var result = memory[n]

    if (typeof memory[n] !== 'number') {
      result = run(n - 1) + run(n - 2)
      memory[n] = result
      console.log(`%c计算结果 ${result}`, 'color: red;')
      console.count('计算次数')
    } else {
      console.log('直接拿到结果', result)
    }

    console.log('memory', memory)
    console.groupEnd()
    return result
  })(n)

  return memory[n]
}

打印结果:


相关文章

  • 函数记忆

  • “函数记忆”

    在计算机领域,记忆(memoization)是主要用于加速程序计算的一种优化技术,它使得函数避免重复盐酸之前已被处...

  • 函数记忆

    什么是函数记忆? 函数记忆是一种编程技巧,通过牺牲算法的空间复杂度以换取更优的时间复杂度 函数记忆的实现 向mem...

  • 函数记忆

  • javascript函数与对象

    JavaScript 函数 存储函数 自记忆函数 函数定义 函数定义和函数表达式function add(a,b)...

  • 函数性能优化——函数记忆

    使用场景 当一些计算结果可以保留下来为以后的运算提供方便的时候, 就可以用到记忆话函数 记忆化函数将计算结果存储起...

  • 纯记忆函数

    纯记忆函数 使用闭包解决重复计算的性能开销 1.斐波纳列数列 func Memoize(function memo...

  • JavaScript 函数记忆

    本文已整理到 Github,地址 ? blog[https://github.com/lio-zero/blog]...

  • vue中记忆函数

    var message = 'Hello Vue.js!'message.split('').reverse()....

  • js—记忆函数 memoize

    应用场景:在切换select下拉框进行接口请求搜索的时候,如果频繁切换会给后台造成很大的压力,所以需要前端用记忆函...

网友评论

      本文标题:“函数记忆”

      本文链接:https://www.haomeiwen.com/subject/wetvdctx.html