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
a(arr, result) 處理剩餘陣列。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 = [] 簡化程式碼。