Javascript数组求和的方法总结 以及由斐波那契数列得到的启发
一次面试中,面试官要求用三种不同的Javascript方法进行一个数字数组的求和,当时思来想去只想到了使用循环这一种笨方法,因此面试比较失败,在这里总结了六种Javascript进行数组求和的方法,以便参考,也好让大家重温一下Javascript基础知识
需求 ,任意一个不知长度的纯数字数组(可以整数、小数或负数),求数组所有元素之和
方法一当然是先想到使用最笨的暴力方法,循环求和法:(其实并不笨,毕竟循环是所有编程语言的一个重要方法,使用它并不丢脸)
二话不说 上代码
var arr = [1,3,4,5,2,3,4,33,3,2,33,33,55,66,77,222,55,3]; var len= arr.length;
var sum = 0;
for(var i=0;i<len;i++){
sum += arr[i];
}
console.log(sum); //输出604
总结一下,可以提取出一个建立在Array对象上的通用方法:
第一种方法:(思路:使用for循环)
Array.prototype.sum0 = function(){
var len= this.length;
var sum = 0;
for(var i=0;i<len;i++){
sum += this[i];
};
return sum;
};
var arr = [1,2,3,4,5];
console.log(arr.sum0); //
那么废话不多说:几种方法依次如下
第二种方法: 思路 (使用while循环,使用do...while思路是类似的)
Array.prototype.sum1 = function(){
var sum = 0;
var i = 0;
while(arr[i]){
sum += this[i];
i++;
};
return sum;
};
var arr = [1,2,3,4,5];
arr.sum1(); //
第三种方法: 思路 (使用递归调用)
那么 : 普通的递归方法如下
Array.prototype.sum2_0 = function(){
var arr = this;
var sum = function(n){
if(n<1){
return NaN
}else {
return (n==1)? arr[0] : arr[n-1]+sum(n-1)
}
};
return sum(this.length);
}
var arr = [1,2,4,5,6];
arr.sum2_0(); //
在Javascript中,普通递归调用是一种不推荐的方法,当数组中数目较多时,执行非常慢,基于斐波那契数列的启发(斐波那契数列算法见文章最后),总结出一种加强版递归方法如下:
Array.prototype.sum2 = function(){
var arr=this;
var sum = (function(){
var memory = [];
return function(n){
if(memory[n] != undefined){
return memory[n]
}else{
if(n<1){
return NaN
}else{
return memory[n] = (n==1)? arr[0] : arr[n-1]+sum(n-1)
}
}
}
})();
return sum(this.length);
};
var arr=[1,2,3,4,5];
arr.sum2(); //
第四种方法: 思路 (使用ES5中Array对象新增的方法reduce)
Array.prototype.sum3 = function(){
return this.reduce(function (a, b){
return a + b;
})
};
var arr = [1,2,3,4,5];
arr.sum3(); //
第五种方法: 思路 (使用ES5中Array对象新增的方法forEach)
Array.prototype.sum4 = function(){
var sum = 0;
this.forEach(function(item){
sum+=item;
});
return sum;
};
var arr = [1,2,3,4,5];
arr.sum4(); //
第六种方法: 思路 (使用Javascript中的特殊方法eval())
Array.prototype.sum5 = function(){
var num = function(item){
return (typeof item == "number")
}; //加了一句数组元素是否为数字的判断,其实上面的每一个例子都需要加判断,只是我们省略了,在最后要重申这一点
if(this.every(num)){
return eval(this.join("+"));
}else {
return NaN
}
};
var arr = [1,2,3,4,5];
arr.sum5(); //
文章的最后就要介绍一下给我启发的斐波那契数列算法:
普通的斐波那契数列公式:(普通递归调用)
function fibonacci(n){
if(n==0||n==1){
return 1
}else {
return fibonacci(n-2)+fibonacci(n-1)
}
};
console.log(fibonacci(10)); //输出55
console.log(fibonacci(100)); //浏览器卡住,几乎没有反应,
加强版的斐波那契数列公式:使用了memoization的方法:
memoization方案在《JavaScript模式》和《JavaScript设计模式》都有提到。memoization是一种将函数执行结果用变量缓存起来的方法。当函数进行计算之前,先看缓存对象中是否有次计算结果,如果有,就直接从缓存对象中获取结果;如果没有,就进行计算,并将结果保存到缓存对象中。
var Fibonacci = (function(){
var memory = [];
return function(n){
if(memory[n] != undefined){
return memory[n]
}else {
return memory[n] = (n==0|| n ==1)? n : Fibonacci(n-2)+Fibonacci(n-1)
}
}
})();
console.log(Fibonacci(100)); // 输出 354224848179262000000 (几乎瞬间完成)
Javascript数组求和的方法总结 以及由斐波那契数列得到的启发的更多相关文章
- 方法输出C++输出斐波那契数列的几种方法
PS:今天上午,非常郁闷,有很多简单基础的问题搞得我有些迷茫,哎,代码几天不写就忘.目前又不当COO,还是得用心记代码哦! 定义: 斐波那契数列指的是这样一个数列:0, 1, 1, 2, 3, 5, ...
- {每日一题}:四种方法实现打印feibo斐波那契数列
刚开始学Python的时候,记得经常遇到打印斐波那契数列了,今天玩玩使用四种办法打印出斐波那契数列 方法一:使用普通函数 def feibo(n): """ 打印斐波那契 ...
- 使用并行的方法计算斐波那契数列 (Fibonacci)
更新:我的同事Terry告诉我有一种矩阵运算的方式计算斐波那契数列,更适于并行.他还提供了利用TBB的parallel_reduce模板计算斐波那契数列的代码(在TBB示例代码的基础上修改得来,比原始 ...
- javascript . 03 函数定义、函数参数(形参、实参)、函数的返回值、冒泡函数、函数的加载、局部变量与全局变量、隐式全局变量、JS预解析、是否是质数、斐波那契数列
1.1 知识点 函数:就是可以重复执行的代码块 2. 组成:参数,功能,返回值 为什么要用函数,因为一部分代码使用次数会很多,所以封装起来, 需要的时候调用 函数不调用,自己不会执行 同名函数会覆盖 ...
- js算法集合(二) javascript实现斐波那契数列 (兔子数列)
js算法集合(二) 斐波那契数列 ★ 上一次我跟大家分享一下做水仙花数的算法的思路,并对其扩展到自幂数的算法,这次,我们来对斐波那契数列进行研究,来加深对循环的理解. Javascript实 ...
- javascript 实现斐波那契数列的不同姿势
快过年了,公司人基本上都走光了,只有共和国最优秀的人才,各部门最重要的岗位才会坚守在各自的转椅上,毕竟每个人的能力有限,与其让他们继续工作,不如放他们回家过年.这觉悟很高,这领悟很痛~ 闲着没事 ...
- 斐波那契数列-java编程:三种方法实现斐波那契数列
题目要求:编写程序在控制台输出斐波那契数列前20项,每输出5个数换行 斐波那契数列指的是这样一个数列:1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, … 这个数列 ...
- 斐波拉契数列(用JavaScript和Python实现)
1.用JavaScript 判断斐波拉契数列第n个数是多少 //需求:封装一个函数,求斐波那契数列的第n项 //斐波拉契数列 var n=parseInt(prompt("输入你想知道的斐波 ...
- JS高级. 06 缓存、分析解决递归斐波那契数列、jQuery缓存、沙箱、函数的四种调用方式、call和apply修改函数调用方法
缓存 cache 作用就是将一些常用的数据存储起来 提升性能 cdn //-----------------分析解决递归斐波那契数列<script> //定义一个缓存数组,存储已经计算出来 ...
随机推荐
- 51 nod 1624 取余最长路 思路:前缀和 + STL(set)二分查找
题目: 写这题花了我一上午时间. 下面是本人(zhangjiuding)的思考过程: 首先想到的是三行,每一行一定要走到. 大概是这样一张图 每一行长度最少为1.即第一行(i -1) >= 1, ...
- Linux Bash Shell字符串截取
#!/bin/bash#定义变量赋值时等号两边不能有空格,否则会报命令不存在 # 运行shell脚本两种方式 # 1.作为解释参数 /bin/sh test.sh ; 2.作为可执行文件 chmo ...
- SQL Server XML数据解析
--5.读取XML --下面为多种方法从XML中读取EMAIL DECLARE @x XML SELECT @x = ' <People> <dongsheng> <In ...
- SqlServer和Oracle中一些常用的sql语句4 局部/全局变量
--把wh1仓库号中姓名含有"平"字的职工工资在原来的基础上加288 update 职工备份 set 工资=工资+288 where 仓库号='wh1' and 姓名 like ' ...
- WPF DataGrid自定义样式
微软的WPF DataGrid中有很多的属性和样式,你可以调整,以寻找合适的(如果你是一名设计师).下面,找到我的小抄造型的网格.它不是100%全面,但它可以让你走得很远,有一些非常有用的技巧和陷阱. ...
- curl命令用于模拟http浏览器发起动作
1.模拟http浏览器发起访问百度首页的动作 curl http://www.baidu.com 2.也可以模拟http浏览器发起POST动作,这个在测试后端程序时非常常见.
- DevOps之归纳总结
唠叨话 关于德语关我屁事的知识点,仅提供精华汇总,具体知识点细节,参考教程网址,如需帮助,请留言. DevOps归纳总结 <DevOps功能与性能>浏览器(饼干Cookie.会话Sessi ...
- scala PartialFunction
1.orElse和andThen的区别 源码如下,区别很明显,orElse是并列的关系,而andThen是调用者的结果作为k的输入. trait PartialFunction[-A, +B] ext ...
- 将JavaScript转化为C#
因为一个需求,不得不将JavaScript转化为C#. 其实有强大的 Node.js. 说说代码, 其实可以使用dynamic 来实现.但是dynamic有很多问题. 直接上代码吧,不是很难,就是很啰 ...
- 解析 .Net Core 注入 (1) 注册服务
在学习 Asp.Net Core 的过程中,注入可以说是无处不在,对于 .Net Core 来说,它是独立的一个程序集,没有复杂的依赖项和配置文件,所以对于学习 Asp.Net Core 源码的朋友来 ...