尾遞歸:遞歸呼叫位於方法末尾,編譯器可將其優化為迴圈,復用堆疊框架。
// 尾遞歸
int FactorialTailRecursion(int n, int acc)
{
if (n == 0) return acc;
return FactorialTailRecursion(n - 1, acc * n);
}
// 編譯器優化為迴圈
int FactorialLoopOptimized(int n, int acc)
{
while (true)
{
if (n == 0) return acc;
acc *= n;
n--;
}
}
int FactorialContinuation(int n, Func<int, int> continuation)
{
if (n == 0) return continuation(1);
return FactorialContinuation(n - 1, r => continuation(n * r));
}
CPS 將「後續計算」封裝為委托傳遞,雖屬尾遞歸,但每層建立新委托物件,無法直接優化為簡單迴圈。需配合 尾呼叫消除 (TCO) 與 委托內聯 等進階編譯器支援。.NET CLR 目前對尾呼叫支援有限(僅 64-bit JIT 在特定條件下優化),F# 則有完整支援。