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

Bài giảng Phân tích và thiết kế thuật giải: Bài 3 - TS. Ngô Quốc Việt

50 39 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 50
Dung lượng 1,68 MB

Nội dung

Bài giảng Phân tích và thiết kế thuật giải - Bài 3 trình bày kiến thức về giải thuật đệ quy. Bài này gồm có một số nội dung sau: Thiết kế giải thuật đệ quy, tại sao dùng đệ quy, khi nào dùng đệ quy, đệ quy tuyến tính, đệ quy nhị phân,...và một số nội dung khác.

PHÂN TÍCH THIẾT KẾ GIẢI THUẬT GIẢI THUẬT ĐỆ QUY TS NGÔ QUỐC VIỆT 2015 Nội dung Giới thiệu Các giải thuật đệ quy Bài tập Hỏi đáp Ngơ Quốc Việt Giới thiệu Chương trình đệ quy chương trình gọi đến Cần phải có điểm dừng chương trình/hàm (trường hợp suy biến) Đệ quy tuyến tính Đệ quy nhị phân Đệ quy phi tuyến, đệ quy lồng Đệ quy hỗ tương       Ngô Quốc Việt Thiết kế giải thuật đệ quy Tham số hoá toán Phân tích trường hợp chung (biểu diễn tốn đồng dạng khác phạm vi hay kích thước giải quyết) Xác định trường hợp dừng (suy biến)    Ngô Quốc Việt Tại dùng đệ quy  Ưu điểm: giải thuật đệ quy đơn giản không đệ quy giải vấn đề => dễ thiết kế, hiểu, cài đặt thay đổi  Nhược điểm : gọi hàm liên tục (tốn nhiều thời gian khơng gian nhớ trong) Trong đó, vấn đề chủ yếu phát sinh số lần gọi hàm có tham số, dẫn đến cần khơng gian lưu trữ stack Ngô Quốc Việt Khi dùng đệ quy Dùng đệ quy để thiết kế giải thuật muốn đơn giản hình thức so với cách viết thơng thường Thường áp dụng cho hàm có yếu tố lặp lại với ngữ cảnh thay đổi Kiểm tra khơng sử dụng q nhiều nhớ    Một số ngôn ngữ (LISP, Scheme) sử dụng đệ quy để tạo vòng lặp, tiến hành theo cách hiệu (dạng tail recursion) Ngô Quốc Việt Đệ quy tuyến tính Lời gọi đệ quy gọi lần hàm 𝐴 𝑛=0 𝑛 𝑎𝑛/2 𝑛 > 0, 𝑛 𝑐ℎẵ𝑛 Ví dụ tính: 𝑎𝑛 = 3𝑛 + 𝑎𝑛−1 𝑛 > 0, 𝑛 𝑙ẻ   int CalAn(int A, int n) { if(n==0) return A; else if(n > && (n %2) ==0) return (n/2)*CalAn(A, n/2); else return (3*n+1)*CalAn(A, n-1); } Ngô Quốc Việt Đệ quy nhị phân Lời gọi đệ quy gọi hai lần hàm  int fiBo(int n) { long res, fn_1, fn_2; if(n 0 Đệ quy hỗ tương   Gọi lại hàm thông qua hàm khác (hai hàm gọi qua lại lẫn nhau) 𝑛=0 𝑥𝑛 = ;𝑦 = 𝑥𝑛−1 + 𝑦𝑛−1 𝑛 > 𝑛 𝑛 ∗ 𝑥𝑛−1 + 𝑦𝑛−1 long calXn(int n); long calYn(int n); 𝑛=0 𝑛>0 long calXn(int n) { long calYn(int n) { long res, i; long res, i; if(n == 0) res = 1; if(n == 0) res = 1; else { else { res = calXn(n-1)+calYn(n-1); res = n*n*calXn(n-1)+calYn(n-1); } } return res return res } } 10 Ngơ Quốc Việt Bài tốn đếm bất thường  Trắng  K  Xanh  ô bất thường  Blob == Những ô bất thường kề (horizontal, vertical diagonal) Người dùng nhập vị trí (x, y) cell o Vd: (chỉ số hàng, cột tính từ 0)  Chương trình trả số blob o Vd: kích thước blob chứa ? 36 Ngơ Quốc Việt Bài tốn đếm bất thường Algorithm count_cells(x, y): if (x, y) outside grid return else if color at (x, y) normal return else Set color at (x, y) to “Temporary” (normal) return + sum of count_cells on neighbors 37 Ngô Quốc Việt Bài tốn đếm bất thường int countCells(color grid[ROWS][COLS], int r, int c) { if (r < || r >= ROWS || c < || c >= COLS) { return 0; } else if (grid[r][c] != ABNORMAL) { return 0; } else { grid[r][c] = TEMPORARY; return + countCells(grid,r-1,c-1) + countCells(grid,r-1,c) + countCells(grid,r-1,c+1) + countCells(grid,r,c+1) + countCells(grid,r+1,c+1) + countCells(grid,r+1,c) + countCells(grid,r+1,c-1) + countCells(grid,r,c1); } } 38 Ngô Quốc Việt Bài tập  Viết chương trình (vịng lặp, đệ quy) để tìm số hạng thứ n dãy xác định bởi: 𝑎0 = 1, 𝑎1 = 3, 𝑎2 = 5, 𝑎𝑛 = 𝑎𝑛−1 + 𝑎𝑛−1 39 Ngô Quốc Việt + 𝑎𝑛−2 Giải Bài tập 40 Ngô Quốc Việt Đệ quy quay lui-Minh hoạ toán hậu  Yêu cầu: hậu đặt bàn cờ vua cho không “ăn” lẫn 41 Ngơ Quốc Việt Bài tốn hậu-Dựa kinh nghiệm     Nhận xét: hậu phải cột (domain knowledge) Đặt hậu vô hàng, chọn hàng cho hậu Đầu tiên, chọn ngẫu nhiên hàng hậu đó, sau vịng lặp di chuyển hậu cho không “ăn” lẫn Tuy nhiên dẫn tới trường hợp khơng tìm lời giải trạng thái ngẫu nhiên ban đầu khơng tốt 42 Ngơ Quốc Việt Bài tốn hậu-Đệ quy quay lui (backtracking)  Đặt “con hậu” hàng đầu tiên, sau ghi nhận cột đường chéo (vì hậu “ăn” ngang, dọc, xéo)  Đặt hậu khác vô hàng kế tiếp, cho không trùng cột đường chéo Ghi nhận cột, đường chéo hậu thứ hai Tiếp tục cho hàng kế  Nếu khơng cịn cột cho hậu hàng kế tiếp, buộc phải trở lại hàng trước tìm chỗ khác cho hậu đặt (có xét ngược đến hàng đầu tiên)  Lặp lại q trình cho cho hàng cịn lại  Demo: http://www.math.utah.edu/~alfeld/queens/queens.html 43 Ngơ Quốc Việt Bài tốn hậu-Đệ quy quay lui void n_Queens(i) { for (j = 1; j

Ngày đăng: 09/05/2021, 18:15

TỪ KHÓA LIÊN QUAN

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

TÀI LIỆU LIÊN QUAN