首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

JavaScript 遞歸函數返回值丟失問題:方向消除算法調試指南

     編輯:程式設計綜合問答

問題現象

實現方向對消除算法(如 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"]

核心原則

  1. 遞歸必須返回:每條遞歸路徑都要有 return
  2. 陣列比較用 join():arr == ["A","B"] 永遠為 false,需轉字符串比較
  3. splice 索引陷阱:連續刪除時,第二次索引需扣除第一次刪除的影響

調試技巧

  • 在每個 return 前加日誌:console.log('return:', JSON.stringify(arr))
  • 使用瀏覽器斷點觀察調用棧
  • 寫單元測試覆蓋邊界情況(空數組、單元素、全配對、部分配對)

補全返回鏈後,算法正常輸出處理後的方向數組,問題徹底解決。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved