javascript - JS递归 ,递归那里有点理解不了,求解释
阿神
阿神 2017-04-10 17:35:05
[JavaScript讨论组]
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是指的每次数组长度还是最初数组长度

阿神
阿神

闭关修行中......

全部回复(3)
大家讲道理

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

天蓬老师

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

伊谢尔伦

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号