zoukankan      html  css  js  c++  java
  • JavaScript语言精粹读后记录

    1.函数的记忆

      有时候,为了避免无谓的运算,利用js的数组相关知识将先前操作的结果记录存储,这一过程称之为记忆。斐波那契数列(第n个数是第n-1个数和第n-2个数之和,最前面的两个数字为0,1)是一个很好的使用例子。

      在我初学前端的时候,我对于这个数列的实现方式是这样的(n最小值为0):

    let fibonacci = function(n){
        return n < 2 ? n: fibonacci(n-1) + fibonacci(n-2)
    }

      代码很简单,只是单纯的使用递归就可以了,但对于这个方法来讲,虽然可以使用,但是对于性能的浪费是很夸张的。

      函数运行时,每次都会计算 fibonacci(0) , fibonacci(1) ,计算fibonacci(n)时又再次计算一次fibonacci(0) , fibonacci(1),知道fibonacci(n-1),在这中间有着大量的重复计算。

      如果我们书写一个闭包函数,让里面放置一个数组,让它存储计算结果,对于很多重复的计算,我们自然能将其避免。

    function memoizer (memo,formula){
      function recur (n){
        let result = memo[n]
        if(typeof result !== 'number'){
          
          result = formula(recur,n)
          memo[n] = result
        }
        return result
      }
      return recur
    }
    
    memoizer([0,1],function(recur,n){
      return recur(n-1) + recur(n-2)
    })(5)
  • 相关阅读:
    【训练题】最优比率生成树 P1696
    2019/9/15 校内模拟赛 考试报告
    b 解题报告
    HDU4714 Tree2cycle 解题报告
    2019/9/2 校内练习赛 考试报告
    2019/8/31 校内模拟赛 考试报告
    2019/8/29 校内模拟赛 考试报告
    康托展开
    洛谷P3807卢卡斯定理
    矩阵
  • 原文地址:https://www.cnblogs.com/h246802/p/8965197.html
Copyright © 2011-2022 走看看