递归实现纸牌数组交叉拼接报missing ) after argument list错误如何解决
交叉洗牌递归实现语法错误排查
需求说明
编写一个接收两个数组作为输入的函数,两个数组分别代表一副纸牌的上半副和下半副,需要通过递归将两副牌洗牌合并,最终返回一个包含两个输入数组交叉元素的单个数组,交叉规则如下:
- 第一个元素为第一个输入数组的第一个元素
- 第二个元素为第二个输入数组的第一个元素
- 第三个元素为第一个输入数组的第二个元素
- 第四个元素为第二个输入数组的第二个元素
以此类推,任意一侧剩下的元素直接追加到结果数组末尾。
已实现版本
非递归实现
function shuffleCards(topHalf, bottomHalf) { let returnArray = []; for (let i = 0; i < Math.max(topHalf.length, bottomHalf.length); i++) { if (topHalf[i]) { returnArray.push(topHalf[i]); } if (bottomHalf[i]) { returnArray.push(bottomHalf[i]); } } return returnArray }
存在问题的递归实现
function shuffleCards(topHalf, bottomHalf) { let results = []; if (topHalf.length) { results.push(topHalf[0] } if (bottomHalf.length) { results.push(bottomHalf[0]) } return results.concat(shuffleCards(topHalf.slice(1), bottomHalf.slice(1))); }
运行时报错:missing ) after argument list
排查方案与修复
1. 语法错误定位
报错是因为两次push方法调用都缺失了右闭合括号:
results.push(topHalf[0]末尾缺少),修正为results.push(topHalf[0])results.push(bottomHalf[0]末尾缺少),修正为results.push(bottomHalf[0])
2. 递归逻辑补全
修复语法错误后代码依然会无限递归导致栈溢出,需要补充递归终止条件:当两个输入数组都被处理为空时,直接返回空数组结束递归。
修复后完整代码
function shuffleCards(topHalf, bottomHalf) { // 递归终止条件 if (topHalf.length === 0 && bottomHalf.length === 0) { return [] } let results = []; if (topHalf.length) { results.push(topHalf[0]) } if (bottomHalf.length) { results.push(bottomHalf[0]) } return results.concat(shuffleCards(topHalf.slice(1), bottomHalf.slice(1))); }
通用括号类语法错误排查技巧
- 利用代码编辑器的括号高亮功能,点击左括号会自动匹配对应的右括号,快速定位缺失位置
- 逐层折叠代码块,分段检查函数调用、条件判断的括号闭合情况
- 注释可疑代码段,逐步缩小报错范围
内容的提问来源于stack exchange,提问作者DaShaman
相关产品推荐
相关产品推荐

