使用递归查找数组中最大三个数时返回undefined的问题排查与修复
问题排查与修复方案
嘿,我来帮你搞定这个递归函数返回undefined的问题!
核心问题:递归调用未传递返回值
你的代码逻辑思路是对的——每次找出数组最大值加入结果数组,移除该最大值后递归,直到结果数组有3个元素时返回。但关键错误是递归调用时没有返回结果:
当递归到arr.length === 3的基准情况时,函数确实返回了正确的[34,9001,10000],但上层的递归调用只是执行了findThreeLargestNumbers(array, arr),没有把这个返回值传递给更上层的函数,最终最外层的函数调用就没有得到任何返回值,所以输出undefined。
修复方法
只需要在递归调用那一行加上return,让每一层递归都把下层的结果传递回来:
let array = [-9, 0, 34, 10000, -420, 6, 9001] function findThreeLargestNumbers(array, arr = []) { if (arr.length === 3) return arr arr.unshift(Math.max(...array)) array.splice(array.indexOf(Math.max(...array)), 1) return findThreeLargestNumbers(array, arr) // 新增return传递递归结果 } console.log(findThreeLargestNumbers(array, [])) // 输出:[34,9001,10000]
额外注意点(非当前问题,但值得关注)
如果原数组中存在重复的最大值,array.indexOf(Math.max(...array))只会找到第一个出现的最大值,splice也只会移除第一个。比如数组是[10000, 10000, 9001],你的代码依然能正常返回三个最大值,但如果业务场景需要处理重复值的特殊逻辑,可能需要调整这部分代码。
内容的提问来源于stack exchange,提问作者ahmed alsaedi
相关产品推荐
相关产品推荐

