javascript 用记忆函数快速计算递归函数


Posted in Javascript onMarch 15, 2010

如果有一个 fibonacci 数列要计算:

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

恐怕数字一大浏览器就会崩掉了,因为运算过程中函数会有大量重复的计算。但 JavaScript 强大的数组和函数闭包可以轻松实现对已计算的结果记忆。运算速度会有指数级的提高。

小而强大的记忆函数:

var memoizer = function (memo, fundamental) { 
var shell = function (n) { 
var result = memo[n]; 
if (typeof result !== 'number') { 
result = fundamental(shell, n); 
memo[n] = result; 
} 
return result; 
}; 
return shell; 
};

第一个参数为初始记忆数列,第二个参数为基础函数。用起来就更简单啦:
var fibonacci = memoizer([0, 1], function (shell, n) { 
return shell(n - 1) + shell(n - 2); 
});

类似的,如果要算 factorial 数列:
var factorial = memoizer([1, 1], function (shell, n) { 
return n * shell(n - 1); 
});
Javascript 相关文章推荐
Ajax执行顺序流程及回调问题分析
Dec 10 Javascript
JavaScript全排列的六种算法 具体实现
Jun 29 Javascript
js防止页面被iframe调用的方法
Oct 30 Javascript
JavaScript获取当前运行脚本文件所在目录的方法
Feb 03 Javascript
基于javascript实现tab选项卡切换特效调试笔记
Mar 30 Javascript
使用jQuery加载html页面到指定的div实现方法
Jul 13 Javascript
JavaScript实战之带收放动画效果的导航菜单
Aug 16 Javascript
React如何将组件渲染到指定DOM节点详解
Sep 08 Javascript
动态加载、移除js/css文件的示例代码
Mar 20 Javascript
vue基础之使用get、post、jsonp实现交互功能示例
Mar 12 Javascript
教你使用vue-cli快速构建的小说阅读器
May 13 Javascript
深入理解Vue keep-alive及实践总结
Aug 21 Javascript
JS 密码强度验证(兼容IE,火狐,谷歌)
Mar 15 #Javascript
javascript css styleFloat和cssFloat
Mar 15 #Javascript
javascript 嵌套的函数(作用域链)
Mar 15 #Javascript
JavaScript 嵌套函数指向this对象错误的解决方法
Mar 15 #Javascript
JQuery 常用操作代码
Mar 14 #Javascript
Jquery Ajax学习实例 向页面发出请求,返回XML格式数据
Mar 14 #Javascript
Jquery cookie操作代码
Mar 14 #Javascript
You might like
php中的三元运算符使用说明
2011/07/03 PHP
PHP IE中下载附件问题解决方法
2014/01/07 PHP
PHP获取本周第一天和最后一天示例代码
2014/02/24 PHP
ThinkPHP CURD方法之field方法详解
2014/06/18 PHP
php自定义中文字符串截取函数substr_for_gb2312及substr_for_utf8示例
2016/05/28 PHP
总结PHP删除字符串最后一个字符的三种方法
2016/08/30 PHP
详解EventDispatcher事件分发组件
2016/12/25 PHP
分享14个很酷的jQuery导航菜单插件
2011/04/25 Javascript
jquery访问ashx文件示例代码
2014/08/11 Javascript
基于jQuery实现的菜单切换效果
2015/10/16 Javascript
JavaScript实现的MD5算法完整实例
2016/02/02 Javascript
Angularjs中的事件广播 —全面解析$broadcast,$emit,$on
2016/05/17 Javascript
JavaScript实现翻页功能(附效果图)
2017/02/16 Javascript
AngularJS入门教程二:在路由中传递参数的方法分析
2017/05/27 Javascript
认识less和webstrom的less配置方法
2017/08/02 Javascript
使用vue官方提供的模板vue-cli搭建一个helloWorld案例分析
2018/01/16 Javascript
用JS实现根据当前时间随机生成流水号或者订单号
2018/05/31 Javascript
Node.js+ELK日志规范的实现
2019/05/23 Javascript
JS实现iframe中子父页面跨域通讯的方法分析
2020/03/10 Javascript
小程序使用分包的示例代码
2020/03/23 Javascript
微信小程序开发(二):页面跳转并传参操作示例
2020/06/01 Javascript
[01:04:05]Mineski vs TNC 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
tensorflow 获取模型所有参数总和数量的方法
2018/06/14 Python
python 用所有标点符号分隔句子的示例
2019/07/15 Python
pyCharm 设置调试输出窗口中文显示方式(字符码转换)
2020/06/09 Python
python求解汉诺塔游戏
2020/07/09 Python
Python3 用matplotlib绘制sigmoid函数的案例
2020/12/11 Python
基于css3 animate制作绚丽的动画效果
2015/11/24 HTML / CSS
英国HYPE双肩包官网:英国本土时尚潮牌
2018/09/26 全球购物
Deux par Deux官方网站:设计师童装
2020/01/03 全球购物
Harrods英国:世界领先的奢侈品百货商店
2020/09/23 全球购物
庆祝新中国成立65周年“向国旗敬礼”网上签名寄语
2014/09/27 职场文书
2014年客房部工作总结
2014/11/22 职场文书
2015年大学班级工作总结
2015/04/28 职场文书
新闻简讯格式及范文
2015/07/22 职场文书
OpenCV实现反阈值二值化
2021/11/17 Java/Android