Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 22 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
22
Dung lượng
376,37 KB
Nội dung
Một số vấn ñề sở Tin học Buổi 3: Cấu trúc liệu thuật giải Giáo viên: Tạ Thúc Nhu Khoa CNTT trường ĐH Lạc Hồng ĐỆ QUI RECURVE Khái niệm Đệ Qui Một khái niệm X ñược ñịnh nghĩa theo kiểu ñệ qui định nghĩa X có sử dụng trực tiếp gián tiếp lại khái niệm X Ví dụ Định nghiã giai thừa số tự nhiên N, ký hiệu N! a) N! = N = b) N! = N*(N-1)! N > Định nghiã UCLN số M N, ký hiệu: UCLN(M, N) a) UCLN(M, N) = M N = b) UCLN(M, N) = UCLN(M, phần dư M/N) N0 Dãy số Fibonacci ñược ñịnh nghĩa sau: a) F(0) = F(1)= b) F(n) =F(n - 2) + F(n - 1) với n>=2 Một định nghiã đệ qui phải có thành phần: • Thành phần dừng: Khơng chứa khái niệm ñang ñịnh nghiã Ví dụ: N! = N = • Thành phần đệ qui: có chứa khái niệm định nghiã Chương trình đệ qui • Một chương trình đệ qui chương trình có lời gọi thực lại Ví dụ: Định nghĩa hàm tính N! theo đệ qui int Fac(int N) { if (N == 0) return 1; return N * Fac(N - 1); } Ví dụ: Tính UCLN(M, N) theo thuật tốn Euclide • (a)UCLN(M, N) = M N = • (b)UCLN(M, N) = UCLN(N, M mod N) N>0 int UCLN(int M, int N) { if (N == 0) return M; return UCLN(N, M % N); } Một số dạng ñệ qui thường gặp 1- Đệ qui tuyến tính Hàm F { Nếu (thỏa điều kiện dừng) Ngược lại } Với S thao tác khơng đệ qui 2- Đệ qui nhị phân Hàm F { Nếu (thỏa ñiều kiện dừng) Ngược lại { gọi hàm F ; gọi hàm F } } • Với S thao tác khơng đệ qui Ví dụ: Hàm tìm giá trị phần tử F(n) dãy Fibonacci int Fibo(int n) { if ( n < ) return ; return Fibo(n -1) + Fibo(n -2) ; } 3- Đệ qui phi tuyến: Lời gọi ñệ qui ñược thực bên vòng lặp Hàm F() { for (giá tri ñầu tới giá trị cuối) { Nếu (thỏa ñiều kiện dừng) Ngược lại < gọi ñệ qui F > } } 10 THUẬT GIẢI QUAY LUI BACK TRACKING 11 Cơng dụng: • Giải toán liệt kê tất lời giải thỏa yêu cầu tốn Ví dụ: Liệt kê dãy nhị phân có độ dài N Liệt kê tập k phần tử tập S={1, 2, , n} Liệt kê chỉnh hợp không lặp chập k tập S={1, 2, , n} 12 Tổng quan thuật giải Quay lui (BackTracking) • Cấu trúc lời giải tập hợp có N phần tử kiểu • Xác định giá trị phần tử, dựa tập giá trị đề cử • Để tìm lời giải khác, ta quay lui chọn giá trị khác cho phần tử Cấu hình lời giải Tập giá trị ñề cử X1 v1 X2 X3 v2 … … Xn … vm 13 Thuật giải 1: Xác ñịnh giá trị phần tử i lời giải void Try( int i ) { for ( v thuộc tập giá trị ñề cử cho Xi ) { Xi = v ; if ( Xi phần tử cuối cùng) < Thơng báo lời giải tìm được>; else Try( i+1); //G i ñ qui ñ xác ñ nh ph n t X[ i+1 ] } } 14 Bài toán: Liệt kê dãy nhị phân có độ dài n Phân tích: • Cấu trúc lời giải dãy có n phần tử: X[1] X[n] • Mỗi phần tử X[ i ] nhận giá trị tập {0, 1} Cấu trúc lời giải 0 … 15 Xác ñịnh giá trị phần tử X[i] dãy nhị phân void Try(int i) { for (int v =0; v