建议32:使用制表
代码所做的事情越少,它的运行速度就越快,因此,避免重复工作很有意义。多次执行相同的任务也在浪费时间。制表法通过缓存先前计算结果为后续计算所使用,避免了重复工作,这使得制表成为递归算法中最有用的技术。
当递归函数被多次调用时,重复工作很多。以下factorial()函数是一个递归函数重复多次的典型例子。

  1. var fact6 = factorial(6);
  2. var fact5 = factorial(5);
  3. var fact4 = factorial(4);
    此代码生成3个阶乘结果,factorial()函数总共被调用了18次。此代码中最糟糕的部分是,所有必要的计算已经在第一行代码中执行过了。因为6的阶乘等于6乘以5 的阶乘,所以5的阶乘被计算了两次。更糟糕的是,4的阶乘被计算了3次。更为明智的方法是保存并重利用它们的计算结果,而不是每次都重新计算整个函数。使用制表法重写factorial()函数:
  4. function memfactorial(n) {
  5. if(!memfactorial.cache) {
  6. memfactorial.cache = {
  7. "0" : 1,
  8. "1" : 1
  9. };
  10. }
  11. if(!memfactorial.cache.hasOwnProperty(n)) {
  12. memfactorial.cache[n] = n * memfactorial(n – 1);
  13. }
  14. return memfactorial.cache[n];
  15. }
    使用制表法设计阶乘函数的关键是建立一个缓存对象,此对象位于函数内部,其中预置了两个最简单的阶乘:0 和1。在计算阶乘之前,先检查缓存中是否已经存在相应的计算结果。没有对应的缓冲值说明这是第一次计算此数值的阶乘,计算完成之后结果被存入缓存之中,以备今后使用。
  16. var fact6 = memfactorial(6);
  17. var fact5 = memfactorial(5);
  18. var fact4 = memfactorial(4);
    上面代码返回3个不同的阶乘值,总共只调用memfactorial()函数8次。既然所有必要的计算都在第一行代码中完成了,那么后两行代码不会产生递归运算,因为直接返回了缓存中的数值。制表过程会因递归函数的种类不同而略有不同,但总体上具有相同的模式。

JS编程建议——32:使用制表相关推荐

  1. JS编程建议——37:推荐使用replace(1)

    建议37:推荐使用replace(1) String对象的replace方法包含两个参数,第一个参数表示执行匹配的正则表达式,也可以传递字符串,第二个参数表示准备代替匹配的子字符串,例如,把字符串ht ...

  2. JS编程建议——8:谨慎使用运算符(3)

    建议8:谨慎使用运算符(3) 要确保变量a的值为连续运算,可以使用小括号逻辑分隔符强迫4个数值先进行连续运算,然后再赋值. a = (1, 2, 3, 4); alert(a); //4 当使用var ...

  3. JS编程建议——7:小心保留字的误用

    建议7:小心保留字的误用 JavaScript语言中定义了很多备用或已经使用的保留字,按首字母顺序列出的保留字. 这些单词中的大多数并没有在语言中使用,但是根据JavaScript语法规则,这些单词是 ...

  4. JS编程建议——42:用好正则表达式静态值

    建议42:用好正则表达式静态值 正则表达式的静态属性比较特殊,有两个名字:长名(全称)和短名(简称,以美元符号开头表示),详细说明见表2.1. 表2.1 RegExp的静态属性 长名 短名 说明 in ...

  5. JS编程建议——2:正确辨析JavaScript句法中的词、句和段

    建议2:正确辨析JavaScript句法中的词.句和段 JavaScript语法包含了合法的JavaScript代码的所有规则和特征,它主要分为词法和句法.词法包括字符编码.名词规则.特殊词规则等.词 ...

  6. JS编程建议——52:建议使用splice删除数组

    建议52:建议使用splice删除数组 删除数组元素的方法有多种,最简单的方法是利用length属性来截断数组,但这种方法比较笨拙,仅能够截断尾部元素.在JavaScript中,由于数组其实就是对象, ...

  7. PHP 安全编程建议

    PHP 安全编程建议 简介 要提供互联网服务,当你在开发代码的时候必须时刻保持安全意识.可能大部分 PHP 脚本都对安全问题都不在意,这很大程度上是因为有大量的无经验程序员在使用这门语言.但是,没有理 ...

  8. p5.js 编程临摹动态图形(互动媒体技术作业)

    p5.js 编程临摹动态图形(互动媒体技术作业) 动态图形的规律分析 p5.js 代码历程 走过的弯路 拓展 总结 动态图形的规律分析 从老师的动态图形参考资料中,我选择了以下图形进行临摹: 初次见面 ...

  9. 我收到的最佳编程建议

    来源:图灵社区 本文约5200字,建议阅读10+分钟 只为编写更少的代码. 本系列文章是由Informit以"我收到的最佳编程建议"为主题发起的专访活动,发布于2012年.现在看来 ...

最新文章

  1. 死而复生?RethinkDB宣布进入Linux基金会!
  2. Spring MVC - 配置Spring MVC
  3. ffmpeg推送图片到流媒体服务器
  4. fdisk 磁盘分区命令
  5. C#vs Java哪一个更快? 将25k C#转换为Java(2)
  6. java 反射类 实例化_java-如何在Android上通过反射实例化成员类
  7. python3的面向对象_python3学习之面向对象
  8. python abc模块_3-2 抽象基类abc模块
  9. 百度BML 图像分类-多标签在线API调试结果记录
  10. 性能测试--jmeter中响应断言【9】
  11. Atitit.nosql api 标准化 以及nosql数据库的实现模型分类差异
  12. Installshield如何实现升级覆盖文件
  13. 将excel表数据顺序与linux,Excel中表格数据进行颠倒顺序的设置方法
  14. MPU6050 加速度计和陀螺仪传感器与 Arduino 连接
  15. 移动端与pc端的区别
  16. 等保测评--网络安全等级保护工作流程
  17. YUV播放器支持10bit视频
  18. 一元二次方程求根c语言编码,一元二次方程求解程序完整代码
  19. 计算机奖学金用英语怎么说,奖学金用英语怎么说
  20. linux java 串口_Java串口通信总结

热门文章

  1. 基于html的日历系统_企业信息化—APS系统(5)选型评估实战 Z 产品
  2. c#随机数生成编号_忘掉 Snowflake,感受一下性能高出587倍的全局唯一ID生成算法...
  3. TimeJot – Last Time 改名,新增中文界面、数字属性,还是那个时间线管理神器[Android]
  4. Spring Cloud微服务之父工程的创建(一)
  5. 分享Discuz! X2插件嵌入点列表(包含门户、社区、群组等)
  6. Memcache安全性
  7. MySQL数据库备份的10个教程
  8. CSS3 Media Query 响应式媒体查询
  9. 每个Linux用户都应该了解的命令行省时技巧
  10. magento左栏添加筛选Filtering options on Left-Navigation Menu in Products List Page