Nay mình bắt gặp ví dụ khá hay, lâu không đúng đến nên cũng mất một chút thời gian để nghĩ. Sau khi giải quyết được rồi thì mình cũng chia sẻ cho mọi người có gì sai, mong được góp ý, vì mình nghĩ những ví dụ nhỏ như này nếu hiểu rõ thì rất tốt:
Mình có 3 hàm sau:
Hàm thứ nhất, dùng phép trừ bình thường:
void func(int n) {
if(n > 0) func(n-1);
printf("%d\n",n);
}
Hàm thứ 2, dùng tiền tố:
void func(int n) {
if(n > 0) func(--n);
printf("%d\n",n);
}
Hàm thứ 3, dùng hậu tố:
void func(int n) {
if(n > 0) func(n--);
printf("%d\n",n);
}
Về kết quả thì chỉ có hàm thứ nhất và hàm thứ 2 có kết quả, và kết quả cũng khác nhau.
Trước khi đi vào nói về kết quả, mình sẽ phân tích luôn lỗi sai của hàm thứ 3:
Hàm thứ 3 là truyền hậu tố, mà nguyên tắc của hậu tố là tiến hành xong mới gán. Cụ thể ở đây n luôn bằng 5 (địa chỉ của n sau các lần gọi hàm khác nhau- có thể coi là các biến khác nhau) , và mãi gọi hàm func(5) dẫn tới segmentation fault (tràn stack)
Còn về kết quả của hàm thứ nhất thì khả đơn giản để đoán, nó sẽ là: 0 1 2 3 4 5:
Về hàm thứ 2 thì nó thể này: toán từ – tiền tố thực hiện thay đổi giá trị trực tiếp của biên luôn, mà không copy bản sao để gán lại như – hậu tố nên khi gọi func(5), nó kiểm tra 5 > 0 đúng và gọi func(4), nghĩa là giá trị n = 4, và nó thêm vào stack printf(4), cứ như vậy, kết quả sẽ là 0 0 1 2 3 4 .
Hi vọng giúp ích cho các bạn mới học.
Có gì sai sót mong mọi người góp ý, mình sẽ sửa.