1. Trang chủ
  2. » Công Nghệ Thông Tin

Bài giảng Kỹ thuật lập trình đệ quy

57 19 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 57
Dung lượng 814 KB

Nội dung

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ử xS, |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 (1N) Số tự nhiên số tự nhiên cộng (nN  (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

Ngày đăng: 11/05/2021, 03:08

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w