JavaScript 记忆(Memoization)函数

记忆函数(Memoization)是一种用于长递归或长迭代操作性能优化的编程实践。

记忆函数实现原理:使用一组参数初次调用函数时,缓存参数和计算结果,当再次使用相同的参数调用该函数时,直接返回相应的缓存结果。

注意: 记忆化函数不能有副作用。

以求解 fibonacci 数为例演示记忆函数

普通递归版

function fibonacci(n) {
    console.log(`calculate fibonacci(${n})...`)
    if (n < 2) {
        return 1;
    } else {
        return fibonacci(n - 2) + fibonacci(n - 1);
    }
}
复制代码

记忆递归版

const memoizedFibonacci = (function () {
    const cache = {} // 计算结果缓存

    return function fibonacci(n) {
        // 不同的参数按一定的规则计算得到不同的缓存键值
        const key = n

        // 每次执行时首先检查缓存
        // 若当前参数的计算结果已有缓存,直接返回缓存结果
        if (cache[key]) {
            return cache[key]
        }

        // 否则,计算、缓存并返回结果
        console.log(`calculate fibonacci(${n})...`)
        if (n < 2) {
            return cache[key] = 1;
        } else {
            return cache[key] = fibonacci(n - 2) + fibonacci(n - 1);
        }
    }
})()
复制代码

执行过程对比

// 依次执行下述语句,观察输出

fibonacci(3);
/**
 * execution-log:
 *   calculate fibonacci(3)...
 *   calculate fibonacci(1)...
 *   calculate fibonacci(2)...
 *   calculate fibonacci(0)...
 *   calculate fibonacci(1)...
 *
 * return-value:
 *   3
 */

fibonacci(5);
/**
 * execution-log:
 *   calculate fibonacci(5)...
 *   calculate fibonacci(3)...
 *   calculate fibonacci(1)...
 *   calculate fibonacci(2)...
 *   calculate fibonacci(0)...
 *   calculate fibonacci(1)...
 *   calculate fibonacci(4)...
 *   calculate fibonacci(2)...
 *   calculate fibonacci(0)...
 *   calculate fibonacci(1)...
 *   calculate fibonacci(3)...
 *   calculate fibonacci(1)...
 *   calculate fibonacci(2)...
 *   calculate fibonacci(0)...
 *   calculate fibonacci(1)...
 *
 * return-value:
 *   8
 */

/* ------------------------------- */

memoizedFibonacci(3);
/**
 * execution-log:
 *   calculate fibonacci(3)...
 *   calculate fibonacci(1)...
 *   calculate fibonacci(2)...
 *   calculate fibonacci(0)...
 *
 * return-value:
 *   3
 */

memoizedFibonacci(5);
/**
 * f
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值