让前端飞

数组求和-JS经典算法编程题目学习-2

2017-04-12  本文已影响0人  过去的声音

    为了突出重点,把内容写在了前面,今天写一下面试中的经典问题之数组求和,上一篇关于查找数组元素位置的文章链接

题目:计算给定数组 arr 中所有元素的总和

输入描述:

数组中的元素均为 Number 类型

输入例子:

sum([ 1, 2, 3, 4 ])

输出例子:

10

   数组求和也是大家极为熟悉的问题,不管是在算法问题中还是实际项目中,都经常会用到这个经典问题,解决的办法有很多,这里帮大家总结一下,也是对自己的一个学习和提升:

1.既然是求和,使用递归思想:一个过程(或函数)直接或间接调用自己本身,这种过程(或函数)叫递归过程(或函数).

例子:

functionsum(arr) {

var   len = arr.length;

if(len == 0){

return 0;

}else if (len == 1){

returnarr [0] ;

}else{

returnarr[0] + sum(arr.slice(1));

}

}


运行结果

递归一直是算法思想里比较难理解的一个知识点,我们一起来看看这个函数的思路和执行步骤吧:首先定义一个sum函数,参数为求和的数组,之后定义数组元素的个数为一个变量len,为了达到求和的目的,就需要遍历数组里的每一个元素,这里采用了.slice属性取到数组中的第二个之后的元素,思考一下,对数组循环执行此方法,是不是可以将数组里的没一个数字单独取出呢?

为了达到这个目的,函数采用if条件先判断数组长度,对于没有元素的数组,返回0,一个元素的,返回元素值,对于数组大于一个的情况,循环调用自身函数,取出第一个元素,直到取出数组中的每一个元素,并求和。

2.常规循环:

如果说递归思想理解起来会有困难的话,这个方法大家应该都能想到,也比较好理解:


function sum(arr) {   

 var s = 0;   

for (var i=0; i<=arr.length-1; i++) {   

    s += arr[i];    }    

return s;

}

3.forEach遍历

functionsum(arr) {

var s =0;

arr.forEach(function(val) {

s += val;

});

return s;

};

运行结果:

for each遍历可以列出数组中的素一个元素,val指代当前元素。

eval法:

function sum(arr) {

return eval(arr.join("+"));

};

这个方法比较厉害,是先用.join将数组里每个元素放入字符串,并用“+”连接,eval命令则可以计算字符串,并执行其中的JS代码。不过eval会改变原词法作用域,是JS引擎优化失效,是运行变慢。所以最好少用eval。这里只是采用这个思想。

上一篇下一篇

猜你喜欢

热点阅读