Đệ quy ↔ lặp; khử đệ quy
Bạn sẽ học được gì
Mọi thuật toán đệ quy đều viết lại được bằng vòng lặp (và ngược lại). Bài này dạy cách chuyển qua lại, và quan trọng hơn — khi nào nên dùng cái nào.
1. Cùng một bài, hai cách viết
Tính giai thừa n!:
Đang tải trình chạy code…
Cùng kết quả. Bản đệ quy đọc gần với định nghĩa toán học hơn; bản lặp thì không tốn call stack (O(1) bộ nhớ thay vì O(n)).
2. Quy tắc chuyển đệ quy → lặp
Với đệ quy đơn giản (mỗi lần gọi chính mình một lần — gọi là đệ quy đuôi/tuyến tính):
1. Tạo một biến tích luỹ kết quả (thay cho giá trị trả về).
2. Dùng vòng lặp chạy theo cùng hướng đệ quy đi (vd n giảm 1 → for/while).
3. Cập nhật biến tích luỹ mỗi vòng (thay cho phép ghép khi quay ngược).
Ví dụ tổng 1 + 2 + ... + n:
Đang tải trình chạy code…
3. Khi nào dùng cái nào?
| Dùng ĐỆ QUY khi | Dùng VÒNG LẶP khi |
|---|---|
| Bài toán tự nhiên đệ quy: cây, đồ thị, chia để trị | Lặp tuyến tính đơn giản (tổng, đếm, duyệt mảng) |
| Code rõ ràng hơn, gần định nghĩa | Cần tiết kiệm bộ nhớ (tránh O(n) call stack) |
| Độ sâu nhỏ, an toàn | Độ sâu lớn (triệu tầng) → tránh tràn stack |
Nguyên tắc: ưu tiên cái nào rõ ràng hơn cho bài toán đó. Đổi sang lặp khi lo tràn stack hoặc cần hiệu năng bộ nhớ.