Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 37 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
37
Dung lượng
690,45 KB
Nội dung
KỸ THUẬT ĐỆ QUY (RECURSION) Khoa Công nghệ thông tin Trường Đại học Ngoại ngữ - Tin học TP.HCM (HUFLIT) Nội dung • Khái niệm Đệ quy • Kỹ thuật cài đặt Hàm đệ quy • Cơ chế hoạt động Hàm đệ quy • Bài tập vận dụng KHÁI NIỆM ĐỆ QUY Khái niệm Đệ quy • Một hàm tốn học định nghĩa: • Thơng qua cơng thức tốn học tường minh • Thơng qua hàm muốn định nghĩa (định nghĩa theo cách đệ quy) • Ví dụ 1: Định nghĩa hàm n! (n giai thừa) 𝒏! = ቈ 1 ∗ ∗ ⋯∗ 𝑛 𝑛ế𝑢 𝑛 = 𝑛ế𝑢 𝑛 > 𝑛ế𝑢 𝑛 = 𝒏! = ቈ 𝑛 ∗ 𝒏 − 𝟏 ! 𝑛ế𝑢 𝑛 > Khái niệm Đệ quy • Ví dụ 2: Hãy tính f(1), f(2), f(3) với 𝑓 𝑛 =൦ 𝑓 𝑛−1 + 𝑓(𝑛 − 1) 𝑛ế𝑢 𝑛 = 𝑛ế𝑢 𝑛 > • Ví dụ 3: Hãy tính f(3), f(4), f(5), f(6) với 𝑓 𝑛 =ቈ 𝑓 𝑛 − + 𝑓(𝑛 − 2) 𝑛ế𝑢 𝑛 = ℎ𝑎𝑦 𝑛 = 𝑛ế𝑢 𝑛 > Khái niệm Đệ quy • Một đối tượng gọi đệ quy định nghĩa thơng qua đối tượng khác dạng với quy nạp • Bài tốn đệ quy tốn phân rã thành tốn nhỏ mang tính chất với tốn ban đầu, toán nhỏ lại phân rã thành toán nhỏ Cứ tiếp tục chia nhỏ đạt kết mong muốn Khái niệm Đệ quy • Các thành phần hàm đệ quy: • Thành phần khơng đệ quy (phần neo) • Điều kiện thoát khỏi đệ quy, gọi trường hợp suy biến • Chứa quy tắc, cơng thức để tính giá trị hàm số • Thành phần đệ quy (cơng thức đệ quy) • Thân hàm có chứa lời gọi đệ quy Thành phần không đệ quy Điều kiện dừng 𝑛ế𝑢 𝑛 = ℎ𝑎𝑦 𝑛 = 𝑓 𝑛 =ቈ 𝑓 𝑛 − + 𝑓(𝑛 − 2) 𝑛ế𝑢 𝑛 > Thành phần đệ quy Điều kiện đệ quy Khái niệm Đệ quy • Nhận xét: Khi thực tính tốn hàm đệ quy: • Thường xuất phát từ Thành phần đệ quy • Q trình tính tốn lặp lặp lại theo cơng thức đệ quy q trình tính tốn phải tiến Thành phần khơng đệ quy Khái niệm Đệ quy • Ví dụ: Mơ tả hàm đệ quy tính USCLN(A, B) Minh họa q trình thực với: A = 126 B = 72 2) A= 72 B = 126 1) 𝐴 𝑛ế𝑢 𝐵 = USCLN(A, B) = ቈ 𝑈𝑆𝐶𝐿𝑁(𝐵, 𝐴 𝑚𝑜𝑑 𝐵) 𝑛ế𝑢 𝐵 ≠ Khái niệm Đệ quy USCLN(A, B) = ቈ 𝐴 𝑛ế𝑢 𝐵 = 𝑈𝑆𝐶𝐿𝑁(𝐵, 𝐴 𝑚𝑜𝑑 𝐵) 𝑛ế𝑢 𝐵 ≠ • Minh họa 1: USCLN(126, 72) = USCLN(72, 54) = USCLN(54, 18) = USCLN(18, 0) = 18 //B = 72 ≠ //B = 54 ≠ //B = 18 ≠ //B = = USCLN(126, 72) = USCLN(72, 54) = USCLN(54, 18) = USCLN(18, 0) = 18 //B = 126 ≠ //B = 72 ≠ //B = 54 ≠ //B = 18 ≠ //B = • Minh họa 2: USCLN(72, 126) 10 Kỹ thuật cài đặt hàm đệ quy • Ví dụ 2: Cài đặt hàm đệ quy tính 𝑎𝑛 𝒂𝒏 = ቈ 𝑎 ∗ 𝒂𝒏−𝟏 𝑛ế𝑢 𝑛 = 𝑛ế𝑢 𝑛 > double Pow(double a, int n) { if (điều kiện dừng) … else … } 23 CƠ CHẾ HOẠT ĐỘNG CỦA HÀM ĐỆ QUY Hoạt động hàm Đệ quy • Hàm đệ quy thực theo pha • Pha tiến (forward): Hàm đệ quy gọi gọi lại gặp điều kiện dừng (giả sử hàm gọi k lần) • Pha lùi (backward): Kết hàm lần gọi thứ k dùng để tính giá trị hàm lần gọi hàm thứ (k-1), …, giá trị hàm lần gọi thứ dùng để tính giá trị hàm lần gọi thứ 25 Hoạt động hàm Đệ quy • Ví dụ: Hoạt động hàm pow(a=5, n=3) Lần Pow(5, 3) return * Pow(5, 2); Lần Pow(5, 2) return * Pow(5, 1); Lần Pow(5, 1) return * Pow(5, 0); Lần k=4 Pow(5, 0) return 1; 26 Hoạt động hàm Đệ quy • Mỗi hàm gọi, hệ điều hành tạo vùng lưu trữ nhớ stack chứa ghi kích hoạt (activation record) hàm • Activation record lưu thơng tin hàm như: • Giá trị trả hàm • Tham số truyền vào hàm • Biến cục hàm • Địa hàm • [Địa liên kết động] 27 Hoạt động hàm Đệ quy • Ví dụ: Hàm double Pow(double a, int n) • Activation record hàm Pow … a n … 0x123 Giá trị trả Tham số Địa hàm • Gọi hàm Pow(5, 3) stack lời gọi hàm là: Lần … … 0x123 Lần … … 0x123 Lần … … 0x123 Lần … … 0x123 Stack 28 Hoạt động hàm Đệ quy • Khi hàm thực xong, activation record lần gọi hàm xóa khỏi stack • Nhận xét: • Nếu hàm đệ quy gọi nhiều dẫn đến tràn nhớ stack (thuật ngữ gọi stack overload) làm chương trình phải dừng! 29 ƯU KHUYẾT ĐIỂM CỦA ĐỆ QUY Ưu khuyết đệ quy • Ưu điểm • Thuật tốn ngắn gọn, sáng • Cài đặt đơn giản, nhanh chóng • Khuyết điểm • Nếu gọi đệ quy nhiều tràn stack • Khi nên dùng đệ quy? • Khi cơng thức đệ quy có số lần gọi đệ quy không làm tràn stack 31 BÀI TẬP VẬN DỤNG Bài tập vận dụng • Bài Viết hàm đệ quy tính hàm sau 𝑓 𝑛 =൦ 𝑓 𝑛−1 + 𝑓(𝑛 − 1) 𝑛ế𝑢 𝑛 = 𝑛ế𝑢 𝑛 > • Bài Viết hàm đệ quy tính số Fibonacci thứ n 𝑓 𝑛 =ቈ 𝑓 𝑛 − + 𝑓(𝑛 − 2) 𝑛ế𝑢 𝑛 = ℎ𝑎𝑦 𝑛 = 𝑛ế𝑢 𝑛 > • Bài Viết hàm đệ quy tính ước số chung lớn số nguyên a, b 𝑈𝑆𝐶𝐿𝑁 𝑎, 𝑏 = ቈ 𝑎 𝑈𝑆𝐶𝐿𝑁(𝑏, 𝑎 𝑚𝑜𝑑 𝑏) 𝑛ế𝑢 𝑏 = 𝑛ế𝑢 𝑏 ≠ 33 Bài tập vận dụng • Bài Viết hàm đệ quy tính số cách chọn k tập từ tập có n phần tử: 𝐶𝑛𝑘 𝐶𝑛𝑘 = 𝑘 𝑘−1 𝐶𝑛−1 + 𝐶𝑛−1 𝑛ế𝑢 𝑘 = ℎ𝑎𝑦 𝑛 = 𝑘 𝑛ế𝑢 𝑘 < 𝑛 • Bài Viết hàm đệ quy tính 𝑎𝑛 (a số thực, n số nguyên) cách hiệu sau 𝒂𝒏 = ൦ (𝒂𝒏/𝟐 )2 𝑎 ∗ (𝒂(𝒏−𝟏)/𝟐 )2 𝑛ế𝑢 𝑛 = 𝑛ế𝑢 𝑛 𝑐ℎẵ𝑛 𝑛ế𝑢 𝑛 𝑙ẻ 34 Bài tập vận dụng • Bài Bài tốn Tháp Hà Nội (Tower of Hanoi) • Cho cột A, B, C có n có kích thước khác xếp theo thứ tự tăng dần kích thước từ xuống: đĩa nhỏ đĩa lớn 35 Bài tập vận dụng • Nhiệm vụ trị chơi di chuyển đĩa lúc đầu cột A (cột ban đầu), di chuyển sang cột C (cột đích) cho đảm bảo thứ tự ban đầu đĩa: đĩa nhỏ nằm đĩa lớn • Một số qui tắc trị chơi: • Mỗi lần di chuyển đĩa từ cột sang cột khác (có thể di chuyển sang cột trung gian B) • Chỉ di chuyển đĩa nằm (khơng di chuyển đĩa nằm giữa) • Đĩa có kích thước lớn khơng thể đặt đĩa có kích thước nhỏ 36 Bài tập vận dụng • Bài Bài tốn “N qn Hậu” Xếp N qn Hậu bàn cờ hình vng kích thước NxN cho khơng qn Hậu “ăn” quân Hậu khác (trên đường chéo, đường ngang, đường dọc bàn cờ có quân hậu) 37