function reduce2(arr, fn, initial) {
var head = arr[0];
var tail = arr.slice(1);
var last = initial;
if (tail.length > 0)
{
last = reduce2(tail, fn, initial);
}
var index = arr.length;
return fn(last, head, index , arr);
}
这个函好像是统计字符串时出现次数,返回一个对象,那个参数fn
代表什么呢,为什么返回之后的fn就是一个对象呢,这里不理解,哪位大神帮我解释一下这个递归函数,还有那个index是指的每次数组长度还是最初数组长度
大家讲道理2017-04-10 17:37:05
其实你问题给得不明确,不过也可以说一下。fn
明显是一个函数,可以从
...
return fn(last, head, index, arr);
...
这一句看出。每次reduce2执行的结果,就是返回的fn(last, head, index, arr)。
我逐行解读一下:
function reduce2(arr, fn, initial) { //假设arr是含有n个元素的数组[a1, a2, ..., an]
var head = arr[0]; //那么head就是这个数组上的第一个元素a1
var tail = arr.slice(1); //剔除a1组成一个新的数组tail[a2, a3, ..., an],这个数组有n-1个元素
var last = initial; // 初始值先赋给last保存
if (tail.length > 0) // tail只要有元素
{//就重新调用reduce2,不过这次第一个参数是tail[a2, a3, ..., an],要继续下去得先算出这个reduce2的返回值;同理要算出这个reduce2的返回值,就得先算出reduce2([a3, a4, ..., an], fn, initial)的返回值
last = reduce2(tail, fn, initial);
}
var index = arr.length;
return fn(last, head, index , arr);
}
所以对于arr为[a1, a2, a3, ..., an]的情况,要算出last
的值得先去算[a2, a3, ..., an]的情况,以此类推,最后是[an]。这样就递归完了。
这样的递归过程看不出作用,重点要看fn
是怎么定义的。