JS编程建议——32:使用制表
建议32:使用制表
代码所做的事情越少,它的运行速度就越快,因此,避免重复工作很有意义。多次执行相同的任务也在浪费时间。制表法通过缓存先前计算结果为后续计算所使用,避免了重复工作,这使得制表成为递归算法中最有用的技术。
当递归函数被多次调用时,重复工作很多。以下factorial()函数是一个递归函数重复多次的典型例子。
- var fact6 = factorial(6);
- var fact5 = factorial(5);
- var fact4 = factorial(4);
此代码生成3个阶乘结果,factorial()函数总共被调用了18次。此代码中最糟糕的部分是,所有必要的计算已经在第一行代码中执行过了。因为6的阶乘等于6乘以5 的阶乘,所以5的阶乘被计算了两次。更糟糕的是,4的阶乘被计算了3次。更为明智的方法是保存并重利用它们的计算结果,而不是每次都重新计算整个函数。使用制表法重写factorial()函数: - 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];
- }
使用制表法设计阶乘函数的关键是建立一个缓存对象,此对象位于函数内部,其中预置了两个最简单的阶乘:0 和1。在计算阶乘之前,先检查缓存中是否已经存在相应的计算结果。没有对应的缓冲值说明这是第一次计算此数值的阶乘,计算完成之后结果被存入缓存之中,以备今后使用。 - var fact6 = memfactorial(6);
- var fact5 = memfactorial(5);
- var fact4 = memfactorial(4);
上面代码返回3个不同的阶乘值,总共只调用memfactorial()函数8次。既然所有必要的计算都在第一行代码中完成了,那么后两行代码不会产生递归运算,因为直接返回了缓存中的数值。制表过程会因递归函数的种类不同而略有不同,但总体上具有相同的模式。
JS编程建议——32:使用制表相关推荐
- JS编程建议——37:推荐使用replace(1)
建议37:推荐使用replace(1) String对象的replace方法包含两个参数,第一个参数表示执行匹配的正则表达式,也可以传递字符串,第二个参数表示准备代替匹配的子字符串,例如,把字符串ht ...
- JS编程建议——8:谨慎使用运算符(3)
建议8:谨慎使用运算符(3) 要确保变量a的值为连续运算,可以使用小括号逻辑分隔符强迫4个数值先进行连续运算,然后再赋值. a = (1, 2, 3, 4); alert(a); //4 当使用var ...
- JS编程建议——7:小心保留字的误用
建议7:小心保留字的误用 JavaScript语言中定义了很多备用或已经使用的保留字,按首字母顺序列出的保留字. 这些单词中的大多数并没有在语言中使用,但是根据JavaScript语法规则,这些单词是 ...
- JS编程建议——42:用好正则表达式静态值
建议42:用好正则表达式静态值 正则表达式的静态属性比较特殊,有两个名字:长名(全称)和短名(简称,以美元符号开头表示),详细说明见表2.1. 表2.1 RegExp的静态属性 长名 短名 说明 in ...
- JS编程建议——2:正确辨析JavaScript句法中的词、句和段
建议2:正确辨析JavaScript句法中的词.句和段 JavaScript语法包含了合法的JavaScript代码的所有规则和特征,它主要分为词法和句法.词法包括字符编码.名词规则.特殊词规则等.词 ...
- JS编程建议——52:建议使用splice删除数组
建议52:建议使用splice删除数组 删除数组元素的方法有多种,最简单的方法是利用length属性来截断数组,但这种方法比较笨拙,仅能够截断尾部元素.在JavaScript中,由于数组其实就是对象, ...
- PHP 安全编程建议
PHP 安全编程建议 简介 要提供互联网服务,当你在开发代码的时候必须时刻保持安全意识.可能大部分 PHP 脚本都对安全问题都不在意,这很大程度上是因为有大量的无经验程序员在使用这门语言.但是,没有理 ...
- p5.js 编程临摹动态图形(互动媒体技术作业)
p5.js 编程临摹动态图形(互动媒体技术作业) 动态图形的规律分析 p5.js 代码历程 走过的弯路 拓展 总结 动态图形的规律分析 从老师的动态图形参考资料中,我选择了以下图形进行临摹: 初次见面 ...
- 我收到的最佳编程建议
来源:图灵社区 本文约5200字,建议阅读10+分钟 只为编写更少的代码. 本系列文章是由Informit以"我收到的最佳编程建议"为主题发起的专访活动,发布于2012年.现在看来 ...
最新文章
- 死而复生?RethinkDB宣布进入Linux基金会!
- Spring MVC - 配置Spring MVC
- ffmpeg推送图片到流媒体服务器
- fdisk 磁盘分区命令
- C#vs Java哪一个更快? 将25k C#转换为Java(2)
- java 反射类 实例化_java-如何在Android上通过反射实例化成员类
- python3的面向对象_python3学习之面向对象
- python abc模块_3-2 抽象基类abc模块
- 百度BML 图像分类-多标签在线API调试结果记录
- 性能测试--jmeter中响应断言【9】
- Atitit.nosql api 标准化 以及nosql数据库的实现模型分类差异
- Installshield如何实现升级覆盖文件
- 将excel表数据顺序与linux,Excel中表格数据进行颠倒顺序的设置方法
- MPU6050 加速度计和陀螺仪传感器与 Arduino 连接
- 移动端与pc端的区别
- 等保测评--网络安全等级保护工作流程
- YUV播放器支持10bit视频
- 一元二次方程求根c语言编码,一元二次方程求解程序完整代码
- 计算机奖学金用英语怎么说,奖学金用英语怎么说
- linux java 串口_Java串口通信总结
热门文章
- 基于html的日历系统_企业信息化—APS系统(5)选型评估实战 Z 产品
- c#随机数生成编号_忘掉 Snowflake,感受一下性能高出587倍的全局唯一ID生成算法...
- TimeJot – Last Time 改名,新增中文界面、数字属性,还是那个时间线管理神器[Android]
- Spring Cloud微服务之父工程的创建(一)
- 分享Discuz! X2插件嵌入点列表(包含门户、社区、群组等)
- Memcache安全性
- MySQL数据库备份的10个教程
- CSS3 Media Query 响应式媒体查询
- 每个Linux用户都应该了解的命令行省时技巧
- magento左栏添加筛选Filtering options on Left-Navigation Menu in Products List Page