freeCodeCamp对称差集递归函数返回UNDEFINED问题排查
问题原因分析
核心错误是递归分支缺少返回语句:
你的函数在else分支完成当前次的对称差计算、拼接新的参数数组调用递归后,没有将递归调用的结果返回给上层调用者,函数执行完else分支的逻辑后没有明确返回值,默认就会返回undefined。
你在if分支打印的结果符合预期,说明递归终止条件(只剩1个参数时的计算逻辑)是正确的,但这个返回值只会被传递到上一层的sym(...values)调用位置,因为上层else分支没有接收并返回这个值,最终外层调用拿到的结果就是undefined。
修复方案
只需要给else分支的递归调用加上return关键字即可,修正后代码如下:
function sym(...args) { if (args.length == 1) { let result = args[0].sort((a, b) => a - b); return result; } else { let fArray = []; let aArray = args[0].filter(t => !args[1].includes(t)); let bArray = aArray.concat(args[1].filter(t => !args[0].includes(t))); bArray.forEach(item => { if (!fArray.includes(item)) fArray.push(item)}); let values = Object.values(args); values.splice(0, 2, fArray); // 新增return,把递归结果返回给上层 return sym(...values); }; };
补充优化建议(可选)
可以用Set简化去重逻辑,代码会更简洁:
// 两个数组对称差计算+去重逻辑可改写为 const diff = new Set([ ...args[0].filter(t => !args[1].includes(t)), ...args[1].filter(t => !args[0].includes(t)) ]) const fArray = [...diff]
内容的提问来源于stack exchange,提问作者David Potts
相关产品推荐
相关产品推荐

