ที่นี่เราจะดูว่าการเรียกซ้ำหางคืออะไร การเรียกซ้ำส่วนท้ายนั้นโดยทั่วไปแล้วจะใช้ฟังก์ชันแบบเรียกซ้ำเป็นคำสั่งสุดท้ายของฟังก์ชัน ดังนั้น เมื่อไม่มีอะไรเหลือให้ทำหลังจากกลับมาจากการโทรแบบเรียกซ้ำ ซึ่งเรียกว่าการเรียกซ้ำส่วนท้าย เราจะเห็นตัวอย่างหนึ่งของการเรียกซ้ำส่วนท้าย
ตัวอย่าง
#include <iostream>
using namespace std;
void printN(int n){
if(n < 0){
return;
}
cout << n << " ";
printN(n - 1);
}
int main() {
printN(10);
} ผลลัพธ์
10 9 8 7 6 5 4 3 2 1 0
การเรียกซ้ำหางดีกว่าการเรียกซ้ำที่ไม่ใช่หาง เนื่องจากไม่มีงานเหลือหลังจากการเรียกซ้ำ คอมไพเลอร์จะเพิ่มประสิทธิภาพโค้ดได้ง่ายขึ้น เมื่อฟังก์ชันหนึ่งถูกเรียก ที่อยู่ของฟังก์ชันนั้นจะถูกเก็บไว้ในสแต็ก ดังนั้นหากเป็นการเรียกซ้ำส่วนท้าย ก็ไม่จำเป็นต้องจัดเก็บที่อยู่ในสแต็ก
เราสามารถใช้แฟกทอเรียลโดยใช้การเรียกซ้ำ แต่ฟังก์ชันไม่ใช่การเรียกซ้ำส่วนท้าย ค่าของ fact(n-1) ถูกใช้ใน fact(n)
long fact(int n){
if(n <= 1)
return 1;
n * fact(n-1);
} เราสามารถทำให้เป็นแบบเรียกซ้ำได้ โดยการเพิ่มพารามิเตอร์อื่นๆ นี่คือด้านล่าง −
long fact(long n, long a){
if(n == 0)
return a;
return fact(n-1, a*n);
}