Nhập Môn Lập Trình ĐỆ QUY (RECURSION) GV BIÊN SOẠN PHẠM NGUYỄN TRƯỜNG AN 3 Nội dung Đệ quy • Một vấn đề mang tính đệ quy nếu như nó có thể được giải quyết thông qua kết quả của chính vấn đề đó nhưng v[.]
ĐỆ QUY (RECURSION) GV BIÊN SOẠN: PHẠM NGUYỄN TRƯỜNG AN Nội dung Đệ quy • Một vấn đề mang tính đệ quy giải thơng qua kết vấn đề với đầu vào đơn giản • VD: Giai thừa: Đệ quy – thuật ngữ • Recursion – Đệ quy • Recursive – Tính đệ quy Recursive problem – vấn đề đệ quy • VD Tổng S(n) số tự nhiên từ đến n Trường hợp • Trường hợp – base case – input đủ nhỏ để ta giải vấn đề mà không cần lời gọi đệ quy Đệ quy C++ • Hàm đệ quy hàm có lời gọi lại thân hàm int giai_thua(int n) { if (n == 0) return 1; else { int kq = n * giai_thua(n - 1); return kq; } } Phân loại đệ quy • Đệ quy tuyến tính - Single recursion – trường hợp đệ quy đề cập lại đến lần • Đệ quy phi tuyến - Multiple recursion – trường hợp đệ quy đề cập lại nhiều lần • Đệ quy hỗ tương – Mutual recursion – trường hợp gặp hàm không trực tiếp gọi lại mà thơng qua hàm khác Đệ quy tuyến tính • Hàm đệ quy tuyến tính có lần gọi lại int giai_thua(int n) { if (n == 0) return 1; else return n * giai_thua(n - 1); } • Ngay lời gọi đệ quy xuất nhiều lần lần chạy int uscln(int a, int b) { if (a == b) return a; else if (a > b) return uscln(a - b, b); else uscln(a, b - a); } Đệ quy tuyến tính • Đệ quy tuyến tính dễ chuyển sang vịng lặp có chức tương đương ➔ Khử đệ quy int giai_thua(int n) { if (n == 0) return 1; else return n * giai_thua(n - 1); } int giai_thua(int n) { int kq = 1; for (int i = 1; i 0) return n + tong(n - 1); else return 0; } int tong_2(int n) { int kq = 0; for (int i = 1; i