Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 40 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
40
Dung lượng
4,76 MB
Nội dung
Trường Đại học Khoa học Tự nhiên Khoa Công nghệ thông tin Bộ môn Tin học sở TIN HỌC CƠ SỞ Đặng Bình Phương dbphuong@fit.hcmuns.edu.vn KỸ THUẬT LẬP TRÌNH ĐỆ QUY VC VC && BB BB Nội dung Tổng quan đệ quy Các vấn đề đệ quy thông dụng Phân tích giải thuật & khử đệ quy Các toán kinh điển Tin học sở - Đặng Bình Phương VC VC && BB BB Bài toán Cho S(n) = + + + … + n =>S(10)? S(11)? S(10) = + + … + 10 = 55 S(11) = + + … + 10 + 11 = 66 = S(10) = 55 + 11 + 11 = 66 Tin học sở - Đặng Bình Phương VC VC && BB BB bước giải toán Bước Thế ngược S(n) Xác định kết toán đồng dạng từ đơn giản đến phức tạp Kết cuối = S(n-1) + n S(n-1) = S(n-2) + n-1 … Bước Phân tích Phân tích thành toán đồng dạng đơn giản Dừng lại toán đồng dạng đơn giản xác định kết = … S(1) + … = S(0) + S(0) = Tin học sở - Đặng Bình Phương VC VC && BB BB Khái niệm đệ quy Khái niệm Một khái niệm X gọi định nghĩa theo đệ quy định nghĩa X có sử dụng khái niệm X Ví dụ Tổng S(n) tính thông qua tổng S(n-1) 2 điều kiện quan trọng Tồn bước đệ quy Điều kiện dừng Tin học sở - Đặng Bình Phương VC VC && BB BB Hàm đệ quy NNLT C Khái niệm Một hàm gọi đệ quy bên thân hàm có lời gọi hàm lại cách trực tiếp hay gián tiếp … Hàm(…) { … … Lời gọi Hàm … … … } ĐQ trực tiếp … Hàm1(…) { … … Lời gọi Hàm2 … … … } … Hàm2(…) { … … Lời gọi Hàmx … … … } ĐQ gián tiếp Tin học sở - Đặng Bình Phương VC VC && BB BB Cấu trúc hàm đệ quy (TS) { Phần dừng (Base step) if () • Phần khởi tính toán { điểm kết thúc thuật toán … • Không chứa hàm return ; định nghĩa } Phần đệ quy (Recursion step) … … Lời gọi Hàm• Có sử dụng hàm định nghĩa … } Tin học sở - Đặng Bình Phương VC VC && BB BB Phân loại TUYẾN TÍNH NHỊ PHÂN Trong thân hàm có lời gọi hàm gọi lại cách tường minh Trong thân hàm có hai lời gọi hàm gọi lại cách tường minh HỖ TƯƠNG PHI TUYẾN Trong thân hàm có lời gọi hàm tới hàm bên thân hàm có lời gọi hàm tới hàm Trong thân hàm có lời gọi hàm lại đặt bên thân vòng lặp Tin học sở - Đặng Bình Phương VC VC && BB BB Đệ quy tuyến tính Ví dụ Tính S(n) = + + … + n S(n) = S(n – 1) + n ĐK dừng: S(0) = Cấu trúc chương trình TênHàm() { if () { … return ; } … TênHàm(); … } : Chương trình : long Tong(int n) { if (n == 0) return 0; return Tong(n–1) + n; } Tin học sở - Đặng Bình Phương VC VC && BB BB Đệ quy nhị phân Ví dụ Cấu trúc chương trình TênHàm() { if () { … return ; } … TênHàm(); … … TênHàm(); … } Tính số hạng thứ n dãy Fibonacy: f(0) = f(1) = f(n) = f(n – 1) + f(n – 2) n > ĐK dừng: f(0) = f(1) = : Chương trình : long Fibo(int n) { if (n == || n == 1) return 1; return Fibo(n–1)+Fibo(n–2); } Tin học sở - Đặng Bình Phương 10 VC VC && BB BB Tháp Hà Nội Mô tả toán Có cột A, B C cột A có N đĩa Tìm cách chuyển N đĩa từ cột A sang cột C cho: • Một lần chuyển đĩa • Đĩa lớn phải nằm • Có thể sử dụng cột A, B, C làm cột trung gian Tin học sở - Đặng Bình Phương 26 VC VC && BB BB Tháp Hà Nội N đĩa A C = N-1 ? đĩa A B + Đĩa N A C + N-1 đĩa B C … N-1 N Cột nguồn A Cột trung gian B Cột đích C Tin học sở - Đặng Bình Phương 27 VC VC && BB BB Tám hậu Mô tả toán Cho bàn cờ vua kích thước 8x8 Hãy đặt hoàng hậu lên bàn cờ cho hoàng hậu “ăn” nhau: • Không nằm dòng, cột • Không nằm đường chéo xuôi, ngược Tin học sở - Đặng Bình Phương 28 VC VC && BB BB Tám hậu – Các dòng n đường Tin học sở - Đặng Bình Phương 29 VC VC && BB BB Tám hậu – Các cột n đường Tin học sở - Đặng Bình Phương 30 VC VC && BB BB Tám hậu – Các đường chéo xuôi 2n-1 đường 14 13 12 11 10 Tin học sở - Đặng Bình Phương 31 VC VC && BB BB Tám hậu – Các đường chéo ngược 2n-1 đường 10 11 12 13 14 Tin học sở - Đặng Bình Phương 32 VC VC && BB BB Tám hậu – Các dòng i=2 j=3 j+i=5 j-i+n-1=8 Tin học sở - Đặng Bình Phương 33 VC VC && BB BB Mã tuần Mô tả toán Cho bàn cờ vua kích thước 8x8 (64 ô) Hãy mã 64 nước cho ô qua lần (xuất phát từ ô bất kỳ) theo luật: Tin học sở - Đặng Bình Phương 34 VC VC && BB BB Nhận xét Ưu điểm Sáng sủa, dễ hiểu, nêu rõ chất vấn đề Tiết kiệm thời gian thực mã nguồn Một số toán khó giải không dùng đệ qui Khuyết điểm Tốn nhiều nhớ, thời gian thực thi lâu Một số tính toán bị lặp lại nhiều lần Một số toán lời giải đệ quy Tin học sở - Đặng Bình Phương 35 VC VC && BB BB Ví dụ đệ quy Fibonacy F(4) F(3) F(2) F(1) F(2) F(1) F(1) F(0) F(0) Lặp lại Tin học sở - Đặng Bình Phương 36 VC VC && BB BB Khử đệ quy (Tham khảo) Khái niệm Đưa toán đệ quy toán không sử dụng đệ quy Thường sử dụng vòng lặp STACK tự tạo … Tin học sở - Đặng Bình Phương 37 VC VC && BB BB Tổng kết Nhận xét Chỉ nên dùng phương pháp đệ quy để giải toán kinh điển giải vấn đề “chia để trị”, “lần ngược” Vấn đề đệ quy không thiết phải giải phương pháp đệ quy, sử dụng phương pháp khác thay (khử đệ quy) Tiện cho người lập trình không tối ưu chạy máy Bước đầu nên giải đệ quy bước khử đệ quy để nâng cao hiệu 38 Tin học sở - Đặng Bình Phương VC VC && BB BB Bài tập Bài 1: Các tập mảng sử dụng đệ quy Bài 2: Viết hàm xác định chiều dài chuỗi Bài 3: Hiển thị n dòng tam giác Pascal a[i][0] = a[i][i] = a[i][k] = a[i-1][k-1] + a[i-1][k] Bài 4: Viết hàm đệ quy tính C(n, k) biết C(n, k) = k = k = n C(n, k) = k > n C(n ,k) = C(n-1, k) + C(n-1, k-1) 0[...]... trường hợp suy biến – neo (điều kiện dừng) Thông điệp thường gặp là StackOverflow do: Thuật giải đệ quy đúng nhưng số lần gọi đệ quy quá lớn làm tràn STACK Thuật giải đệ quy sai do không hội tụ hoặc không có điều kiện dừng Tin học cơ sở 2 - Đặng Bình Phương 15 VC VC && BB BB Các vấn đề đệ quy thông dụng Đệ quy? ? Tin học cơ sở 2 - Đặng Bình Phương 16 VC VC && BB BB 1.Hệ thức truy hồi Khái niệm... Đặng Bình Phương 13 VC VC && BB BB Ví dụ gọi hàm đệ quy Tính số hạng thứ 4 của dãy Fibonacy F(4) 5 3 F(3) 1 F(1) 2 F(2) 3 + 2 + 1 F(0) 5 + 1 F(1) 2 F(2) 1 F(1) 2 + 1 F(0) Tin học cơ sở 2 - Đặng Bình Phương 14 VC VC && BB BB Một số lỗi thường gặp Công thức đệ quy chưa đúng, không tìm được bài toán đồng dạng đơn giản hơn (không hội tụ) nên không giải quy t được vấn đề Không xác định các trường hợp... cơ sở 2 - Đặng Bình Phương 12 VC VC && BB BB Các bước xây dựng hàm đệ quy Thông số hóa bài toán Tìm thuật giải tổng quát Tìm các trường hợp suy biến (neo) Tổng quát hóa bài toán cụ thể thành bài toán tổng quát Thông số hóa cho bài toán tổng quát VD: n trong hàm tính tổng S(n), … Chia bài toán tổng quát ra thành: Phần không đệ quy Phần như bài toán trên nhưng kích thước nhỏ hơn VD: S(n)... vấn đề Tiết kiệm thời gian thực hiện mã nguồn Một số bài toán rất khó giải nếu không dùng đệ qui Khuyết điểm Tốn nhiều bộ nhớ, thời gian thực thi lâu Một số tính toán có thể bị lặp lại nhiều lần Một số bài toán không có lời giải đệ quy Tin học cơ sở 2 - Đặng Bình Phương 35 VC VC && BB BB Ví dụ cây đệ quy Fibonacy F(4) F(3) F(2) F(1) F(2) F(1) F(1) F(0) F(0) Lặp lại Tin học cơ sở 2 - Đặng Bình...VC VC && BB BB Đệ quy hỗ tương Ví dụ Cấu trúc chương trình TênHàm1() { if () return ; … TênHàm2(); … } TênHàm2() { if () return ; … TênHàm1(); … } Tính số hạng thứ n của dãy: x(0) = 1, y(0) = 0 x(n) = x(n – 1) + y(n – 1) y(n) = 3*x(n – 1) + 2*y(n – 1) ĐK dừng: x(0) = 1, y(0) = 0 : Chương trình : long yn(int n); long xn(int... Ta có: • Vh = 2Vh-1 • V0 = 2 Đệ quy tuyến tính với V(h)=2*V(h-1) và điều kiện dừng V(0) = 2 Tin học cơ sở 2 - Đặng Bình Phương 18 VC VC && BB BB 1.Hệ thức truy hồi Ví dụ 2 Gửi ngân hàng 1000 USD, lãi suất 12%/năm Số tiền có được sau 30 năm là bao nhiêu? Giải pháp Gọi Tn là số tiền có được sau n năm Ta có: • Tn = Tn-1 + 0.12Tn-1 = 1.12Tn-1 • V(0) = 1000 Đệ quy tuyến tính với T(n)=1.12*T(n-1)... • Nếu x < A[mid] tìm trong đoạn [l, mid – 1] • Ngược lại tìm trong đoạn [mid + 1, r] Sử dụng đệ quy nhị phân Tin học cơ sở 2 - Đặng Bình Phương 21 VC VC && BB BB 2.Chia để trị (divide & conquer) Một số bài toán khác Bài toán tháp Hà Nội Các giải thuật sắp xếp: QuickSort, MergeSort Các giải thuật tìm kiếm trên cây nhị phân tìm kiếm, cây nhị phân nhiều nhánh tìm kiếm Lưu ý Khi bài toán... 3*xn(n-1)+2*yn(n-1); } Tin học cơ sở 2 - Đặng Bình Phương 11 VC VC && BB BB Đệ quy phi tuyến Ví dụ Cấu trúc chương trình TênHàm() { if () { … return ; } … Vòng lặp { … TênHàm(); … } … } Tính số hạng thứ n của dãy: x(0) = 1 x(n) = n2x(0) + (n-1)2x(1) + … + 22x(n – 2) + 12x(n – 1) ĐK dừng: x(0) = 1 : Chương trình : long xn(int n) { if (n == 0) return 1; long s = 0; for (int i=1;... phân tìm kiếm, cây nhị phân nhiều nhánh tìm kiếm Lưu ý Khi bài toán lớn được chia thành các bài toán nhỏ hơn mà những bài toán nhỏ hơn này không đơn giản nhiều so với bài toán gốc thì không nên dùng kỹ thuật chia để trị Tin học cơ sở 2 - Đặng Bình Phương 22 VC VC && BB BB 3.Lần ngược (Backtracking) Khái niệm Tại bước có nhiều lựa chọn, ta chọn thử 1 bước để đi tiếp Nếu không thành công thì “lần... (divide & conquer) Khái niệm Chia bài toán thành nhiều bài toán con Giải quy t từng bài toán con Tổng hợp kết quả từng bài toán con để ra lời giải Tin học cơ sở 2 - Đặng Bình Phương 20 VC VC && BB BB 2.Chia để trị (divide & conquer) Ví dụ 1 Cho dãy A đã sắp xếp thứ tự tăng Tìm vị trí phần tử x trong dãy (nếu có) Giải pháp: thuật toán tìm kiếm nhị phân mid = (l + r) / 2; Nếu A[mid] = x trả ... Thuật giải đệ quy số lần gọi đệ quy lớn làm tràn STACK Thuật giải đệ quy sai không hội tụ điều kiện dừng Tin học sở - Đặng Bình Phương 15 VC VC && BB BB Các vấn đề đệ quy thông dụng Đệ quy? ?... pháp đệ quy để giải toán kinh điển giải vấn đề “chia để trị”, “lần ngược” Vấn đề đệ quy không thiết phải giải phương pháp đệ quy, sử dụng phương pháp khác thay (khử đệ quy) Tiện cho người lập. ..VC VC && BB BB Nội dung Tổng quan đệ quy Các vấn đề đệ quy thông dụng Phân tích giải thuật & khử đệ quy Các toán kinh điển Tin học sở - Đặng Bình Phương VC VC && BB