January6,2018首先感谢同事在我第一次实习期间的指导。养成写博客的习惯下面开始讨论我遇到的第一个问题,这是一个值得像我这样的新手在阅读javascript高级编程时思考的问题。什么是迭代==>(我在学校被狗吃了~)关于Array.ruduce()ECMAScript5这本书还新增了两个合并数组的方法:reduce()和reduceRight()。这两种方法都遍历数组中的所有项目并构建一个最终返回的值。其中,reduce()方法从数组的第一项开始,逐项遍历到末尾。而reduceRight()从数组的最后一项开始,向前遍历到第一项。这两种方法都有两个参数:调用每个项目的函数和(可选)合并所基于的初始值。传递给reduce()和reduceRight()的函数接收4个参数:前一个值、当前值、项目的索引和数组对象。此函数返回的任何值都会作为第一个参数自动传递给下一项。第一次迭代发生在数组的第二项上,因此第一个参数是数组的第一项,第二个参数是数组的第二项。使用reduce()方法对数组中的所有值进行求和,如:varvalues=[1,2,3,4,5];varsum=values.reduce(function(prev,cur,index,array){returnprev+cur;});alert(sum);第一次执行回调函数,prev为1,cur为2。第二次,prev为3(2加1的结果),cur为3(数组中的第三项)。这个过程会一直持续下去,直到访问完数组中的每一项,最后返回结果。我的理解是数组值有5项,所以数组需要进行4次操作(1+2)=>3(3+3)=>6(6+4)=>10(10+5)=>15如何证明,demoletarr=[1,2,3,4,5]letsum=arr.reduce((prev,cur,index,array)=>{console.log("执行了first",index,"cur的值为",cur,"prev的值为",prev)//原来的console.log可以使用returnprev+cur})console.log(sum)的结果为第一次执行cur的值为2prev的值为1
第二次执行cur的值为3prev的值为3
cur的值为4prev的值为6
/>第4次执行,cur的值为5,prev的值为10
15===>猜得到!!!===>但是如果用迭代,what你可以做?这种东西真的很重要,到处都可以用,js也是!!!)关于迭代(去百度了一波。。。)定义:直接或间接调用自身迭代的函数需要满足三个条件:必须有一个明确的终止条件。函数处理的数据规模一定在减小。转换必须是可解的。intsum(intn){如果(n==1)返回1;elsereturnn+sum(n-1);}也是求0~n的和,这段代码每次都在函数体中调用自己的函数,1~n的和可以拆分成两部分,1~n-1加n之和,因此,递归的思想是:在函数或子过程内部,直接或间接调用自己的算法,从而将问题转化为子问题缩尺同类题
递归算法步骤:确定递归公式,如sum(n)=sum(n-1)+n确定递归结束条件,如n=1结束递归函数letarr=[1,2,3,4,5]letsum=arr.reduce((prev,cur,index,array)=>{console.log("执行了",index,"次cur的值为",cur,"prev的值为",prev)//原来的console.log可以用returnprev+cur})console.log(sum)可以理解为functionadd(n){if(n==1){return1}returnadd(n-1)+n}console.log(add(5));当函数add(n)执行for时遇到add(n-1)第一次进入这个函数执行add(n-1)时,【这里,我们注意到add(1)=1(即递归终止)】然后遇到add(n-1-1),当n=2点时=>add(2){add(2-1)+2=>add(1)+2=>1+2}可以pushadd(3){add(2)+3=>1+2+3}加法(4){加法(3)+4=>1+2+3+4}加法(5){加法(4)+5=>1+2+3+4+5}so,本篇博客完结,感谢阅读,点赞加人气哈哈~~
