使用递归在JavaScript中实现整数数组求和
解决整数数组递归求和的问题
首先,咱们来拆解下你当前代码里的几个核心问题:
- 每次调用
sumOfInts时,counter和result都会被重新初始化为0,之前的累加状态根本没法保留,这完全违背了递归的思路(递归是通过函数自身调用传递状态,不是靠函数内部的局部变量) else分支里既没有返回值,也没有正确触发递归调用,导致函数执行到这里就直接结束了,自然不会输出任何结果- 基线条件(递归的终止条件)写得不对,
counter === array.length - 2这个判断太局限,没法覆盖数组为空、只有一个元素等情况
递归的核心逻辑其实很简单:把大问题拆成更小的子问题,直到子问题小到可以直接解决(基线条件)。针对数组求和,咱们可以这么梳理:
- 基线条件:如果数组为空,直接返回0;如果数组只有一个元素,返回这个元素本身
- 递归条件:数组的总和 = 第一个元素的值 + 剩余所有元素的总和(剩余元素的总和就交给递归调用去解决)
基于这个思路,我们可以写出简洁正确的递归实现:
function sumOfInts(array) { // 基线条件:空数组的和为0 if (array.length === 0) { return 0; } // 递归:取第一个元素,加上剩余数组的求和结果 return array[0] + sumOfInts(array.slice(1)); } // 测试调用 console.log(sumOfInts([1,2,3,4])); // 输出10
如果你更倾向于用类似"索引遍历"的方式(避免每次调用都创建新数组切片),可以通过传递索引参数来实现:
function sumOfInts(array, index = 0) { // 基线条件:索引超出数组范围,返回0 if (index >= array.length) { return 0; } // 递归:当前元素的值 + 后续元素的求和结果 return array[index] + sumOfInts(array, index + 1); } console.log(sumOfInts([1,2,3,4])); // 输出10
再回头看你尝试的递归调用,之所以没成功,是因为你在else里只修改了局部变量,却没有把递归调用的结果返回,而且每次调用函数都会重置counter和result,状态根本传不下去。如果一定要基于你的原始代码修改,需要把这两个变量作为参数传递,但这种写法会冗余很多,不如上面两种思路清晰。
最后再划个重点:写递归一定要记住三个点——明确的基线条件、每次解决更小的子问题、正确返回递归调用的结果,缺一不可哦。
内容的提问来源于stack exchange,提问作者Jenny
相关产品推荐
相关产品推荐

