Bài giảng Kỹ thuật lập trình đệ quy gồm có những nội dung chính sau: Giới thiệu về lập trình đệ quy, phân loại các dạng đệ quy, hoạt động của đệ quy, xây dựng giải thuật đệ quy, các giải thuật đệ quy tiêu biểu, các giải pháp thay thế cho đệ quy. Mời các bạn cùng tham khảo.
5/4/2016 Nội dung Giới thiệu lập trình đệ quy Phân loại dạng đệ quy Hoạt động đệ quy Xây dựng giải thuật đệ quy Các giải thuật đệ quy tiêu biểu Các giải pháp thay cho đệ quy Tóm tắt chương 5/4/2016 [3.1] Giới thiệu lập trình đệ quy Khi lập trình, gặp dạng tốn: đối tượng khó định nghĩa cách tường minh Kỹ thuật định nghĩa đối tượng qua nó: kỹ thuật đệ quy (recursion) Ví dụ: gương đối diện Chiếc thứ chứa hình thứ hai ngược lại Ta hình dung dãy ảnh vơ hạn hai gương Ví dụ: truyền hình, biên tập viên ngồi kế bên hình chương trình phát, có dãy hình ảnh lập lập lại nhỏ dần 5/4/2016 [3.1] Giới thiệu lập trình đệ quy Đệ quy sử dụng rộng rãi khoa học máy tính lý thuyết tính tốn Định nghĩa theo đệ quy khái niệm định nghĩa khái niệm thông qua khái niệm muốn định nghĩa Ví dụ: định nghĩa đệ quy sau: Giai thừa n (n!): Nếu n=0 n=1 Nếu n>1 5/4/2016 n!=1 n!=(n-1)! * n [3.1] Giới thiệu lập trình đệ quy Ký hiệu số phần tử hữu hạn S |S|: Nếu S= |S| = Nếu S≠ chắn có phần tử xS, |S|=|S\{x}|+1 Đây phương pháp định nghĩa tập hợp Tập số tự nhiên: Số số tự nhiên (1N) Số tự nhiên số tự nhiên cộng (nN (n+1)N) 5/4/2016 [3.1] Giới thiệu lập trình đệ quy Cấu trúc danh sách liên kết (linklist/xâu) kiểu T: Cấu trúc rỗng danh sách liên kết kiểu T Kết nối thành phần kiểu T (nút kiểu T) vào danh sách liên kết kiểu T, ta có danh sách liên kết kiểu T 5/4/2016 [3.1] Giới thiệu lập trình đệ quy Ví dụ trên, để định nghĩa đệ quy gồm phần: Phần cố định (cơ sở - neo – anchor): trường hợp suy biến (trường hợp đặc biệt) thuật toán qua điều kiện cụ thể (phần dừng đệ quy – chương trình phải có tính dừng) Phần đệ quy (quy nạp): mơ tả thuật tốn trường hợp phổ biến qua đối tượng (gọi hàm đệ quy) cách gián tiếp hay trực tiếp Lưu ý: phần đệ quy phải tiến phần không đệ quy 5/4/2016 [3.2] Phân loại đệ quy Đệ quy tuyến tính Đệ quy nhị phân Đệ quy phi tuyến Đệ quy hỗ tương 5/4/2016 Đệ quy tuyến tính Bước 1: Nếu thỏa điều kiện dừng thực thao tác S (trả kết quả) Bước 2: Ngược lại: Bước 2.1 thực lệnh S* Bước 2.2 Gọi hàm đệ quy (cho đối tượng thường nhỏ hơn) S, S*: xử lý không đệ quy Có thể gộp bước 2.1 2.2 lại 5/4/2016 Đệ quy tuyến tính Hàm tính giai thừa (n!) Bước 1: Nếu n=0 n=1 trả Bước 2: Ngược lại: trả n*Giai_thừa(n-1) 5/4/2016 10 Bước 3: Phân rã theo hướng đệ quy Tìm giải thuật trường hợp tổng quát cách phân rã thành thành phần nhỏ không đệ quy tốn đệ quy với kích thước nhỏ 5/4/2016 43 Bài tốn tháp hà nội B1: Thơng hóa hóa tốn: Xét mức tổng qt: chuyển n (n>0) đĩa từ cột A sang cột C với cột B làm trung gian Ta gọi hàm có tên thapHaNoi(n,A,B,C) với bốn tham số, thơng số n thông số thay đổi, ta gọi n thông số điều khiển 5/4/2016 44 Bài toán tháp hà nội B2: Trường hợp suy biến giải thuật: Với n=1 toán tổng quát suy biến thành toán đơn giản thapHaNoi(1,A,B,C), lúc cần chuyển đĩa từ cột A sang cột C xong (trong B cột trung gian), ta có thao tác chuyenDia(A,C) 5/4/2016 45 Bài toán tháp hà nội B3: Phân rã toán: Muốn n đĩa từ cột A sang cột C, với cột B cột trung gian thapHaNoi, ta thực công việc sau: Chuyển (n-1) đĩa từ cột A sang cột B, lấy C làm trung gian: thapHaNoi(n-1,A,C,B) Chuyển đĩa từ cột A sang cột C: chuyenDia(A,C) thao tác không đệ quy Chuyển (n-1) đĩa từ cột B sang cột C, lấy A làm trung gian: thapHaNoi(n-1,B,A,C) 5/4/2016 46 Bài tốn tháp hà nội Ta có giải thuật sau: thapHaNoi(n,A,B,C) Bước 1: Nếu chưa dừng (n>1) Bước 1.1 thapHaNoi(n-1,A,C,B) Bước 1.2 chuyenDia(A,C) Bước 1.3 thapHaNoi(n-1,B,A,C) 5/4/2016 47 void chuyenDia(char A, char C) { printf("Chuyen tu dia %c sang dia %c\n", A, C); } void thapHaNoi(int n, char A, char B, char C) { if(n>0) { thapHaNoi(n - 1, A, C, B); chuyenDia(A, C); thapHaNoi(n - 1, B, A, C); } } int main() { } thapHaNoi(3, 'A', 'B', 'C'); 5/4/2016 return 0; 48 Tìm cơng thức khơng đệ quy Ví dụ: Tính tổng S(n)=1+2+ +n, với n>0 int tongDeQuy(int n) { if (n == 1) return 1; return n + tongDeQuy(n - 1); } int tongS(int n) { return n * (n + 1) / 2; } 5/4/2016 49 Dùng vòng lặp để khử đệ quy Ví dụ: Tính tổng S(n)=1+2+ +n, với n>0 int tongVongLap(int n) { int S = 0; for (int i = 1; i