javascript - JS递归 ,递归那里有点理解不了,求解释

查看:108
本文介绍了javascript - JS递归 ,递归那里有点理解不了,求解释的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

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是指的每次数组长度还是最初数组长度

解决方案

其实你问题给得不明确,不过也可以说一下。
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是怎么定义的。

这篇关于javascript - JS递归 ,递归那里有点理解不了,求解释的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆