尾遞迴(tail recursion)是指一個函數在調用自身之後不做任何操作就直接返回,這種遞迴方式可以被編譯器優化為迴圈,從而大大提高遞迴的效率。一般性的遞迴在調用自身之後需要保存當前的函數上下文,而這些上下文的保存需要額外的記憶體空間和時間成本,因此效率相對較低。
以下是一段使用尾遞迴技巧的JavaScript程式碼例子,該程式碼實現了計算一個正整數的階乘的功能:
function factorial(n, acc = 1) {
if (n === 0) {
return acc;
} else {
return factorial(n - 1, acc * n);
}
}
// 計算5的階乘
console.log(factorial(5)); // 120
在這個例子中,函數factorial使用了一個額外的參數acc來保存計算結果,如果n等於0,則直接返回acc;否則,將計算結果acc乘以n作為新的acc值,同時將n-1作為新的參數遞迴調用函數本身。這樣可以使得遞迴在每次調用自身之後直接返回,不需要保留任何的函數上下文,因此可以避免額外的記憶體開銷,提高遞迴的效率。