如何用递归实现JavaScript函数求数字各位的平均值?
解决JavaScript数字各位平均值计算的递归求和问题
你的代码目前返回undefined有两个核心原因:
- 你定义了递归求和的
sumRecursion函数,但从未调用它,也没有在averageOfDigits函数中返回最终的平均值计算结果 arrOfNum.pop()会直接修改原数组,属于不必要的副作用,建议避免
修正后的完整代码
function averageOfDigits(number) { // 处理负数:取绝对值避免负号干扰数字转换 let arrOfStr = Math.abs(number).toString().split(''); // 转换为整数数组(用Number比parseFloat更适合整数转换) let arrOfNum = arrOfStr.map(Number); // 递归求和函数:用索引遍历,不修改原数组 function sumRecursion(arr, index = 0) { // 递归终止条件:索引超出数组范围,返回0 if (index >= arr.length) { return 0; } // 当前元素值 + 剩余元素的递归和 return arr[index] + sumRecursion(arr, index + 1); } // 计算总和与平均值并返回 const total = sumRecursion(arrOfNum); return total / arrOfNum.length; } console.log(averageOfDigits(999)); // 输出9 console.log(averageOfDigits(123)); // 输出2 console.log(averageOfDigits(-456)); // 输出5
关键修正说明
- 补全核心逻辑:调用递归求和函数,计算总和后除以数字位数,返回最终平均值
- 处理边界情况:用
Math.abs()处理负数输入,避免负号被转换成无效数字 - 优化递归实现:改用索引遍历的方式,避免修改原数组,逻辑更安全清晰
- 高效类型转换:将
parseFloat替换为Number,更适合整数类型的转换需求
另一种递归实现(基于数组切片)
如果你偏好基于数组长度的递归写法,可以用slice()避免修改原数组:
function sumRecursion(arr) { if (arr.length === 0) { return 0; } // 取第一个元素 + 剩余数组的递归和 return arr[0] + sumRecursion(arr.slice(1)); }
内容的提问来源于stack exchange,提问作者FutureOwl
相关产品推荐
相关产品推荐

