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

JavaScript 遞迴函式回傳 undefined:缺少自我呼叫與回傳值

     編輯:程式設計綜合問答

錯誤程式碼分析

function a(arr, result) {
    if (!result) result = [];
    if (arr.length > 0) {
        result.push(arr[0]);
        arr.splice(0, 1);
        // ❌ 缺少遞迴呼叫 a(arr, result)
        // ❌ 缺少 return result
    } else {
        return result; // 只有基底案例回傳
    }
}
// 呼叫時 arr.length > 0,進入 if 區塊,執行完無 return → 回傳 undefined
var aa = a([1,2,3,4,5]);
console.log("result ==", aa); // undefined

核心問題

  1. 遞迴缺少自我呼叫:處理完第一個元素後,未再呼叫 a(arr, result) 處理剩餘陣列。
  2. 遞迴路徑缺少回傳:即使加上自我呼叫,若不 return a(arr, result),外層呼叫仍拿不到結果。

修正版本一:純遞迴(函數式風格)

function a(arr, result = []) {
    if (arr.length === 0) return result; // 基底案例
    result.push(arr[0]);
    arr.splice(0, 1);
    return a(arr, result); // ✅ 遞迴呼叫並回傳
}

var aa = a([1,2,3,4,5]);
console.log("result ==", aa); // [1,2,3,4,5]

修正版本二:外部累加器(副作用風格)

function a(arr, result) {
    if (!result) result = [];
    if (arr.length > 0) {
        result.push(arr[0]);
        arr.splice(0, 1);
        a(arr, result); // 遞迴處理,不需回傳
    }
    return result; // 統一在函數尾部回傳
}

var aa = [];
a([1,2,3,4,5], aa);
console.log("result ==", aa); // [1,2,3,4,5]

遞迴三要素檢查表

要素說明本例對應
基底案例終止條件,直接回傳結果arr.length === 0
遞迴步驟縮小問題規模,呼叫自身arr.splice(0,1); a(arr, result)
結果傳遞每層都要回傳給上層return a(...) 或外部累加器

效能提醒

JavaScript 引擎對尾端遞迴優化 (TCO) 支援有限(僅 Safari 完整實作)。大量資料建議改用迴圈或 Array.prototype.reduce:

const result = [1,2,3,4,5].reduce((acc, val) => { acc.push(val); return acc; }, []);

總結

遞迴函式回傳 undefined 通常是遞迴呼叫缺少 return 或 基底案例以外路徑未回傳。養成「每條執行路徑皆有回傳」的習慣,並善用預設參數 result = [] 簡化程式碼。

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