为何排序函数返回undefined?控制台输出正确但函数返回值异常
递归函数返回undefined但控制台打印正确?问题出在这儿!
先看看你的代码:
let sorted = []; function reset(){ sorted = []; } function sort(list) { let least = list[0]; for (let i = 0; i < list.length; i++){ if (list[i] < least ){ least = list[i]; } } sorted.push(least); list.splice(list.indexOf(least),1); if (list[0] !== undefined){ sort(list) } else { let answer = sorted; reset(); console.log(answer); return answer; } } let s...
这个问题其实很典型——你在递归调用的时候没有把返回值传递回上层函数。
咱们拆解一下执行流程:
- 每次调用
sort(list),当数组还没处理完时(list[0] !== undefined),你会再次调用sort(list),但这次调用的结果没有被return出去。 - 只有最后一次递归(数组处理完进入else分支)会返回正确的
answer,但这个返回值只回到了它的上一层调用,而上一层调用并没有把这个值继续返回,就这样一层层“断了”,导致最开始的函数调用拿不到任何返回值,结果就是undefined。 - 至于控制台能打印正确结果,是因为最后那层递归确实生成了正确的
answer并执行了console.log(answer)。
解决办法超简单,只需要在递归调用时加上return:
if (list[0] !== undefined){ // 把递归调用的结果返回给上层 return sort(list) } else { let answer = sorted; reset(); console.log(answer); return answer; }
这样每一层递归都会把最终的排序结果传递回上一层,直到最外层的调用,就能拿到正确的返回值了。
另外提个小建议:你的代码里用splice修改了原数组,这会给调用者带来意料之外的副作用。如果不想修改原数组,可以在函数开头先复制一份:
function sort(list) { // 复制原数组,避免修改原数据 let newList = [...list]; let least = newList[0]; for (let i = 0; i < newList.length; i++){ if (newList[i] < least ){ least = newList[i]; } } sorted.push(least); newList.splice(newList.indexOf(least),1); if (newList[0] !== undefined){ return sort(newList) } else { let answer = sorted; reset(); console.log(answer); return answer; } }
内容的提问来源于stack exchange,提问作者Austin Ballard
相关产品推荐
相关产品推荐

