javascript 用记忆函数快速计算递归函数
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);
});
var factorial = memoizer([1, 1], function (shell, n) {
return n * shell(n - 1);
});
相关推荐
-
JavaScript学习笔记之函数记忆
本文讲解函数记忆与菲波那切数列的实现,分享给大家,具体如下 定义 函数记忆是指将上次的计算结果缓存起来,当下次调用时,如果遇到相同的参数,就直接返回缓存中的数据. 举个例子: function add(a, b) { return a + b; } // 假设 memorize 可以实现函数记忆 var memoizedAdd = memorize(add); memoizedAdd(1, 2) // 3 memoizedAdd(1, 2) // 相同的参数,第二次调用时,从缓存中取出数据,而非
-
JavaScript Memoization 让函数也有记忆功能
比如说,我们想要一个递归函数来计算 Fibonacci 数列.一个 Fibonacci 数字是之前两个 Fibonacci 数字之和.最前面的两个数字是 0 和 1. 复制代码 代码如下: var fibonacci = function (n) { return n < 2 ? n : fibonacci(n - 1) + fibonacci(n - 2); }; for (var i = 0; i <= 10; i += 1) { document.writeln('// ' + i +
-
javascript 用记忆函数快速计算递归函数
如果有一个 fibonacci 数列要计算: 复制代码 代码如下: var fibonacci = function (n) { return n < 2 ? n : fibonacci(n - 1) + fibonacci(n - 2); }; 恐怕数字一大浏览器就会崩掉了,因为运算过程中函数会有大量重复的计算.但 JavaScript 强大的数组和函数闭包可以轻松实现对已计算的结果记忆.运算速度会有指数级的提高. 小而强大的记忆函数: 复制代码 代码如下: var memoizer = fu
-
JavaScript ES6的函数拓展
目录 ES6函数拓展 函数的默认参数 reset参数 name属性 箭头函数 ES6函数拓展 函数的默认参数 之前的写法: function count(x, y) { return x + y; } count(3);//因为只传递了参数x,y的默认值为undefined //undefined + 3返回NaN function count(x, y) { x = x || 0; y = y || 0; return x + y; } count(3);//3
-
Javascript中eval函数的使用方法与示例
定义和用法 eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码. 语法 eval(string) 参数 描述 string 必需.要计算的字符串,其中含有要计算的 JavaScript 表达式或要执行的语句. 返回值 通过计算 string 得到的值(如果有的话). 说明 该方法只接受原始字符串作为参数,如果 string 参数不是原始字符串,那么该方法将不作任何改变地返回.因此请不要为 eval() 函数传递 String 对象来作为参数. 如果试图覆盖 eval
-
深入剖析JavaScript中的函数currying柯里化
curry化来源与数学家 Haskell Curry的名字 (编程语言 Haskell也是以他的名字命名). 柯里化通常也称部分求值,其含义是给函数分步传递参数,每次传递参数后部分应用参数,并返回一个更具体的函数接受剩下的参数,这中间可嵌套多层这样的接受部分参数函数,直至返回最后结果. 因此柯里化的过程是逐步传参,逐步缩小函数的适用范围,逐步求解的过程. 柯里化一个求和函数 按照分步求值,我们看一个简单的例子 var concat3Words = function (a, b, c) { r
-
JavaScript装饰器函数(Decorator)实例详解
本文实例讲述了JavaScript装饰器函数(Decorator).分享给大家供大家参考,具体如下: 装饰器函数(Decorator)用于给对象在运行期间动态的增加某个功能,职责等.相较通过继承的方式来扩充对象的功能,装饰器显得更加灵活,首先,我们可以动态给对象选定某个装饰器,而不用hardcore继承对象来实现某个功能点.其次:继承的方式可能会导致子类繁多,仅仅为了增加某一个单一的功能点,显得有些多余了. 下面给出几个常用的装饰器函数示例,相关代码请查看github. 1 动态添加onload
-
JavaScript中eval()函数用法详解
eval() 函数计算 JavaScript 字符串,并把它作为脚本代码来执行. 如果参数是一个表达式,eval() 函数将执行表达式.如果参数是Javascript语句,eval()将执行 Javascript 语句. 语法 复制代码 代码如下: eval(string) 参数 描述 string 必需.要计算的字符串,其中含有要计算的 JavaScript 表达式或要执行的语句. eval()函数用法详解: 此函数可能使用的频率并不是太高,但是在某些情况下具有很大的作用,下面就介绍一下eva
-
深入认识JavaScript中的函数
概述 函数是进行模块化程序设计的基础,编写复杂的Ajax应用程序,必须对函数有更深入的了解.JavaScript中的函数不同于其他的语言,每个函数都是作为一个对象被维护和运行的.通过函数对象的性质,可以很方便的将一个函数赋值给一个变量或者将函数作为参数传递.在继续讲述之前,先看一下函数的使用语法: function func1(-){-} var func2=function(-){-}; var func3=function func4(-){-}; var func5=new Functio
-
Javascript的匿名函数讲解
一.什么是匿名函数? 在Javascript定义一个函数一般有如下三种方式: 函数关键字(function)语句: 复制代码 代码如下: function fnMethodName(x){alert(x);} 函数字面量(Function Literals): 复制代码 代码如下: var fnMethodName = function(x){alert(x);} Function()构造函数: 复制代码 代码如下: var fnMethodName = new Function('x','al
-
Javascript的匿名函数小结
一.什么是匿名函数? 在Javascript定义一个函数一般有如下三种方式: 函数关键字(function)语句: function fnMethodName(x){alert(x);} 函数字面量(Function Literals): var fnMethodName = function(x){alert(x);} Function()构造函数: var fnMethodName = new Function('x','alert(x);') 上面三种方法定义了同一个方法函数fnMetho
-
AJAX入门之深入理解JavaScript中的函数
概述 函数是进行模块化程序设计的基础,编写复杂的Ajax应用程序,必须对函数有更深入的了解.JavaScript中的函数不同于其他的语言,每个函数都是作为一个对象被维护和运行的.通过函数对象的性质,可以很方便的将一个函数赋值给一个变量或者将函数作为参数传递.在继续讲述之前,先看一下函数的使用语法: function func1(-){-}var func2=function(-){-};var func3=function func4(-){-};var func5=new Function()
随机推荐
- Java环境变量的设置方法(图文教程)
- js绘制圆形和矩形的方法
- 详解MySQL日期 字符串 时间戳互转
- 不错的mod_perl编程的简单应用实例介绍
- javascript 不用reverse实现字符串反转的代码
- .NET微信公众号 用户分组管理
- CentOS 7 下使用 iptables
- 分享下php5类中三种数据类型的区别
- PHP给文字内容中的关键字进行套红处理
- JavaScript动态插入script的基本思路及实现函数
- Firebug 字幕文件JSON地址获取代码
- 解析php中call_user_func_array的作用
- 优化Jquery,提升网页加载速度
- systemd添加自定义系统服务设置自定义开机启动的方法
- 深入剖析java中的集合框架
- C#修改IIS站点framework版本号的方法
- 修改jquery.lazyload.js实现页面延迟载入
- 需要注意的十大垃圾食品
- 利用Catalyst交换机处理蠕虫病毒的入侵
- 详解使用spring boot admin监控spring cloud应用程序