美文网首页让前端飞
数组求和-JS经典算法编程题目学习-2

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

作者: 过去的声音 | 来源:发表于2017-04-12 15:42 被阅读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。这里只是采用这个思想。

    相关文章

      网友评论

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

        本文链接:https://www.haomeiwen.com/subject/fmtmattx.html