Đệ quy: base case & recursive case
Đệ quy là khi một hàm tự gọi chính nó để giải bài toán nhỏ hơn. Bạn sẽ hiểu hai phần bắt buộc — base case (điều kiện dừng) và recursive case (bước thu nhỏ) — và thấy chúng hoạt động qua một ví dụ chạy từng tầng.
1. Trực quan: búp bê Nga (matryoshka)
Mở một con búp bê Nga, bên trong là con nhỏ hơn, lại mở ra con nhỏ hơn nữa... tới con bé nhất không mở được thì dừng. Đệ quy y hệt: mỗi bước giải một bài nhỏ hơn, tới khi gặp bài nhỏ nhất giải được ngay thì dừng lại.
giai_thua(3)
└─ cần 3 × giai_thua(2)
└─ cần 2 × giai_thua(1)
└─ cần 1 × giai_thua(0)
└─ = 1 ← con búp bê bé nhất (BASE CASE)
2. Hai phần BẮT BUỘC của mọi hàm đệ quy
- Base case (điều kiện dừng): trường hợp nhỏ nhất, trả lời được ngay không cần gọi tiếp. Đây là cái chặn đệ quy chạy mãi.
- Recursive case (bước đệ quy): tự gọi chính mình với đầu vào nhỏ hơn, tiến về phía base case.
def giai_thua(n):
if n == 0: # BASE CASE: dừng
return 1
return n * giai_thua(n - 1) # RECURSIVE CASE: nhỏ dần về 0
Quên base case (hoặc bước đệ quy không tiến về base) → hàm gọi mãi không dừng → tràn ngăn xếp (stack overflow), chương trình sập. Học kỹ ở bài 1.3.2.
3. Chạy debug: đi xuống rồi quay ngược
Đệ quy có hai pha: đi xuống (gọi sâu dần tới base case) rồi quay ngược (trả kết quả lên).
Bước qua giai_thua(3) và để ý hai pha đó:
4. Code mẫu (chạy thật)
Thử đổi giai_thua(5) thành số khác và chạy lại. Lưu ý: cả hai hàm đều có base case (n == 0) và
recursive case (gọi với n - 1, nhỏ dần về 0).
5. Cách NGHĨ đệ quy (đừng cố lần theo từng tầng)
Người mới hay cố "chạy trong đầu" hết mọi tầng — rất rối. Mẹo: tin tưởng. Giả sử
giai_thua(n - 1) đã đúng, thì n × giai_thua(n - 1) có đúng không? Nếu có, và base case đúng,
thì cả hàm đúng. Chỉ cần kiểm 2 điều:
- Base case có đúng không?
- Recursive case: giả sử bài nhỏ hơn đã giải đúng, ghép lại có ra bài lớn không?
6. Mẫu nhận diện
- Bài toán tự chứa bản nhỏ hơn của chính nó (giai thừa, tổng, duyệt cây, chia để trị).
- Luôn hỏi: base case là gì? và mỗi lần gọi có nhỏ dần về base case không?
7. 🎮 Trò chơi: Đệ quy
8. Quiz kiểm tra nhanh
9. Hoàn thành
…☑️ Tiếp theo: 1.3.2 — Ngăn xếp lời gọi & tràn stack (đệ quy "tốn chỗ" ở đâu).