zoukankan      html  css  js  c++  java
  • JavaScript 高级技巧 Memoization

    JavaScript 高级技巧 Memoization:https://segmentfault.com/a/1190000016703106

    总结:缓存函数调用结果

    // 实现阶乘
    
    //不使用 memoization
    //不假思索,我们会立即写下如下的代码:
    const factorial = n => {
        if (n === 1) {
            return 1
        } else {
            return factorial(n - 1) * n
        }
    };
    
    //使用 memoization 
    <font color="red">(原理:就是用一个数组变量记录函数执行结果,执行函数时先查询在变量里是否存在对应的值,如果存在则直接返回结果,不存在则去执行函数计算)</font>
    const cache = []
    const factorial = n => {
        if (n === 1) {
            return 1
        } else if (cache[n - 1]) {
            return cache[n - 1]
        } else {
            let result = factorial(n - 1) * n
            cache[n - 1] = result
            return result
        }
    };
    
    //使用 闭包 和 memoization
    //常见的方式就是 闭包 和 memoization 一起搭配使用:
    const factorialMemo = () => {
        const cache = []
        const factorial = n => {
            if (n === 1) {
                return 1
            } else if (cache[n - 1]) {
                console.log(`get factorial(${n}) from cache...`)
                return cache[n - 1]
            } else {
                let result = factorial(n - 1) * n
                cache[n - 1] = result
                return result
            }
        }
        return factorial
    };
    const factorial = factorialMemo();
    
    //继续变形,下面这种编写方式是最常见的形式。
    const factorialMemo = func => {
        const cache = []
        return function(n) {
            if (cache[n]) {
                console.log(`get factorial(${n}) from cache...`)
                return cache[n]
            } else {
                const result = func.call(this, n)
                cache[n] = result
                return result
            }
        }
    }
    const factorial = factorialMemo(function(n) {
        return n === 1 ? 1 : factorial(n - 1) * n
    });
    
    // 从阶乘的这个例子可以知道 memoization 是一个空间换时间的方式,存储执行结果,下次再次发生相同的输入会直接输出结果,提高了执行的速度。
    
  • 相关阅读:
    (转)python字符串函数
    分享二:架构设计分享一:关于API分布式服务提供方式
    架构设计分享一:关于分布式系统的数据一致性问题(一)
    分享四:分布式事务设计-两段式提交
    分享三:mysql跨库查询
    PHP笔试题
    我的mysql学习心得
    linux分享一:进程全攻略--守护进程(服务)
    分享二:签名原理与算法
    linux命令详解:pgrep命令
  • 原文地址:https://www.cnblogs.com/myc-xiaochaochao/p/13968477.html
Copyright © 2011-2022 走看看