實現方向對消除算法(如 NORTH-SOUTH、EAST-WEST 相互抵消),遞歸邏輯正確,中間 alert 顯示預期結果,但最終函數返回 undefined。
遞歸函數中調用子函數(dirCompare)或自身(checkDir)時,未使用 return 將返回值層層向上傳遞,導致調用鏈斷裂。
function checkDir(arr, num) {
if (baseCase) return arr;
else {
// 錯誤:調用後未返回
dirCompare("SOUTH", num, arr);
}
}
function checkDir(arr, num) {
// 基線條件:數組為空、長度1或特定模式
if (num === arr.length - 1 || arr.length === 0 || arr.join() === "NORTH,WEST,SOUTH,EAST") {
return arr;
}
switch (arr[num]) {
case "NORTH": return dirCompare("SOUTH", num, arr);
case "SOUTH": return dirCompare("NORTH", num, arr);
case "EAST": return dirCompare("WEST", num, arr);
case "WEST": return dirCompare("EAST", num, arr);
}
}
function dirCompare(target, index, arr) {
// 尋找配對方向
for (let i = index + 1; i < arr.length; i++) {
if (arr[i] === target) {
// 刪除配對項(注意索引偏移)
arr.splice(index, 1);
arr.splice(i - 1, 1);
return checkDir(arr, index); // 關鍵:返回遞歸結果
}
}
// 未找到配對,檢查下一位
return checkDir(arr, index + 1);
}
// 測試
console.log(checkDir(["WEST", "NORTH"], 0)); // ["WEST", "NORTH"]
console.log(checkDir(["NORTH", "SOUTH", "EAST"], 0)); // ["EAST"]
returnarr == ["A","B"] 永遠為 false,需轉字符串比較return 前加日誌:console.log('return:', JSON.stringify(arr))補全返回鏈後,算法正常輸出處理後的方向數組,問題徹底解決。