検索

ホームページ  >  に質問  >  本文

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

阿神阿神2896日前257

全員に返信(3)返信します

  • 大家讲道理

    大家讲道理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是怎么定义的。

    返事
    0
  • 天蓬老师

    天蓬老师2017-04-10 17:37:05

    fn是回调函数,在这个reduce函数执行完毕后调用。index是最初的arr长度

    返事
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-10 17:37:05

    理解一个递归最简单的办法是传几组随机数据 格式要正确 然后把fn传入一个console.log方法 打印所有参数 看执行过程和结果

    返事
    0
  • キャンセル返事