zoukankan      html  css  js  c++  java
  • 一种优化递归算法的方法(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

    伸手摘星,即使徒劳无功也不致满手污泥。
  • 相关阅读:
    WebMatrix简介与预览
    使用NuGet增加常见包引用
    用Jquery实现的一个Table的帮助js
    使用AspNetPager进行存储过程分页
    Android之旅AppWidget
    SQL积累
    【问题记录】Asp.net WebApplication和WebSite中用户控件的使用区别
    ActionScript 3.0工厂模式实例
    ActionScript 3.0 实现单态模式
    装饰器模式小结
  • 原文地址:https://www.cnblogs.com/sq-blogs/p/12817233.html
Copyright © 2011-2022 走看看