กล่าวง่ายๆคือการเรียกซ้ำหางเป็นการเรียกซ้ำที่คอมไพเลอร์สามารถแทนที่การเรียกซ้ำด้วยคำสั่ง "goto" ดังนั้นเวอร์ชันที่คอมไพล์จะไม่ต้องเพิ่มความลึกของสแต็ก
บางครั้งการออกแบบฟังก์ชั่น tail-recursive คุณจำเป็นต้องสร้างฟังก์ชั่นตัวช่วยพร้อมพารามิเตอร์เพิ่มเติม
ตัวอย่างเช่นนี่ไม่ใช่ฟังก์ชันแบบเรียกซ้ำ:
int factorial(int x) {
if (x > 0) {
return x * factorial(x - 1);
}
return 1;
}
แต่นี่เป็นฟังก์ชั่นแบบเรียกซ้ำ:
int factorial(int x) {
return tailfactorial(x, 1);
}
int tailfactorial(int x, int multiplier) {
if (x > 0) {
return tailfactorial(x - 1, x * multiplier);
}
return multiplier;
}
เพราะคอมไพเลอร์สามารถเขียนฟังก์ชัน recursive ไปยังฟังก์ชันที่ไม่ใช่แบบเรียกซ้ำโดยใช้บางสิ่งเช่นนี้ (pseudocode):
int tailfactorial(int x, int multiplier) {
start:
if (x > 0) {
multiplier = x * multiplier;
x--;
goto start;
}
return multiplier;
}
กฎสำหรับคอมไพเลอร์นั้นง่ายมาก: เมื่อคุณพบ " return thisfunction(newparameters);
" ให้แทนที่ด้วย " parameters = newparameters; goto start;
" แต่สามารถทำได้เฉพาะเมื่อค่าที่ส่งคืนโดยการเรียกซ้ำเรียกคืนโดยตรง
หากการเรียกซ้ำทั้งหมดในฟังก์ชันสามารถเปลี่ยนได้เช่นนี้แสดงว่าเป็นฟังก์ชันแบบเรียกซ้ำ