题目回顾给定一个整数数组nums、一个 reducer 函数fn和一个初始值init返回通过依次对数组的每个元素执行fn函数得到的最终结果。通过以下操作实现这个结果val fn(init, nums[0])val fn(val, nums[1])val fn(val, nums[2])...直到处理数组中的每个元素。然后返回val的最终值。如果数组的长度为 0则函数应返回init。请你在不使用内置数组方法的Array.reduce前提下解决这个问题。示例numsfninit输出[1,2,3,4](a, b) a b010[1,2,3,4](a, b) a * b124[](a, b) a b2525限制不能使用内置Array.prototype.reduce。 核心思路这道题本质上就是手动实现reduce理解并模拟其执行过程。创建一个变量result并初始化为init用来保存累积结果。顺序遍历数组nums中的每一个元素nums[i]用归约函数fn将当前累积值和当前元素组合result fn(result, nums[i])。数组遍历完后result即为最终结果。空数组特例当nums.length 0时循环不会执行直接返回init符合题目要求。 算法步骤设result init。循环变量i从0到nums.length - 1result fn(result, nums[i])返回result。 代码实现var reduce function(nums, fn, init) { // 初始化累积值为 init let result init; //依次遍历数组 for (let i 0; i nums.length; i) { // 依次应用归约函数,对每个元素执行fn更新结果 result fn(result, nums[i]); } // 返回最终结果 return result; };要点说明let result init把初始值赋给累积变量相当于Array.reduce的第二个参数。for循环逐个遍历数组元素每次用fn更新累积值保持与reduce相同的行为。空数组直接跳过循环返回init。 复杂度分析时间复杂度O(n)n为数组长度只需一次线性遍历。空间复杂度O(1)仅使用常数级别的额外空间变量result和循环索引。✅ 关键点与技巧手动实现 reduce 的意义理解归约操作的迭代本质fn可以将任意两个值合并为一个值通过循环累积这一过程。初始值的角色init不仅用于数组为空时的默认返回也作为第一个“累积值”参与第一次fn调用就像Array.reduce的行为一样。通用性这个模式可以处理求和、求积、函数组合、Promise 链等多种归约场景。不使用内置方法本题要求不能直接用Array.reduce但允许其他数组方法如for循环——这是为了理解底层实现。 扩展思考如果题目要求在没有初始值时使用数组的第一个元素作为初始值类似于Array.reduce只传一个参数你会怎么改如果 init 未传递则将 result 设为 nums[0]并从索引 1 开始循环。这种模式是函数式编程中的fold折叠可以衍生出map、filter等操作。理解reduce是掌握函数式思想的重要一步。PS本文由deepseek辅助生成