Nội dung Tổng quan về đệ quy Tối ưu và khử đệ quy Ứng dụng của giải thuật đệ quy... Mục tiêu Hiểu rõ giải thuật đệ quy Ưu và khuyết điểm của giải thuật đệ quy Phương pháp khử đ
Trang 1Chương 2:
Đệ quy và giải thuật đệ quy
Gi ả ng viên: Ths Nguy ễ n Th ị Khiêm Hòa
Trang 2Nội dung
Tổng quan về đệ quy
Tối ưu và khử đệ quy
Ứng dụng của giải thuật đệ quy
Trang 3Mục tiêu
Hiểu rõ giải thuật đệ quy
Ưu và khuyết điểm của giải thuật đệ quy
Phương pháp khử đệ quy
Một số bài toán ứng dụng giải thuật đệ quy điển hình.
Trang 4Tổng quan về đệ quy
Khái niệm
Giải thuật đệ quy
Một thuật toán được gọi là đệ quy nếu nó giải bài toán bằng cách rút gọn liên tiếp bài toán gốc thành bài toán
cũng như vậy nhưng có đ ầ u vào nh ỏ h ơ n.
Hàm đệ quy
Trang 5{ Mở từ điển vào trang “giữa”
Xác định xem nửa nào của từ điển chứa từ cần tìm;
if (từ đó nằm ở nửa trước)
tìm từ đó ở nửa trước else tìm từ đó ở nửa sau.
}
Trang 6Nguyên tắc hoạt động
Tính chất không thể thiếu đối với đệ quy là tính h ữ u h ạ n
Hàm đệ quy về cơ bản gồm hai phần:
Phần cơ sở (Phần neo):
Phần đệ quy:
Trang 7Thiết kế giải thuật đệ qui
tuần tự 3 nội dung sau :
Thông số hóa bài toán
tương ứng
bằng phân rã bài toán theo kiểu đệ quy
Trang 9Ưu và nhược điểm của đệ qui
Ưu điểm:
Sáng sủa, dễ hiểu, nêu rõ bản chất vấn đề
Tiết kiệm thời gian hiện thực mã nguồn
Nhược điểm:
Tốn nhiều bộ nhớ, thời gian thực thi lâu
Một số bài toán không có lời giải đệ quy
Trang 10Phân loại giải thuật đệ qui
Đệ quy phân thành 2 loại :
Đệ quy trực tiếp:
C()
Trang 11Một số dạng giải thuật đệ quy đơn giản
Đệ quy tuyến tính Hàm đệ qui tuyến tính dạng:
P (<tham số>)
{
if (điều kiện dừng) {
<Xử lý trường hợp neo>
} Else {
[Tập lệnh A];
P(<tham số>);
[Tập lệnh B];
} }
Trang 12Một số dạng giải thuật đệ quy đơn giản
định nghĩa như sau:
Trang 13Một số dạng giải thuật đệ quy đơn giản
Đệ quy nhị phân
P (<tham số>)
{
if (điều kiện dừng) {
<Xử lý trường hợp neo>
} Else {
Trang 14Một số dạng giải thuật đệ quy đơn giản
Ví dụ 1: Tính số hạng thứ n của dãy Fibonaci được định nghĩa như sau:
f 1 = f 0 =1 ;
f n = f n-1 + f n-2 ; (n>1)
int Fibo(int n) {
if ( n < 2 ) return 1 ; else
return (Fibo(n -1) + Fibo(n -2)) ; }
Trang 15Một số dạng giải thuật đệ quy đơn giản
Đệ quy phi tuyến
<Xử lý trường hợp neo>;
} else {
[Tập lệnh B];
P (<danh sách tham số>);
} }
Trang 16Một số dạng giải thuật đệ quy đơn giản
Ví dụ: Cho dãy {X n } xác định theo công thức truy hồi:
Trang 17Một số dạng giải thuật đệ quy đơn giản
Trang 18Một số dạng giải thuật đệ quy đơn giản
Ví dụ: Tính số hạng thứ n của hai dãy {X n }, {Y n } được
định nghĩa như sau:
X 0 =Y 0 =1 ;
X n = X n-1 + Y n-1 ; (n>0)
Y n = n 2 X n-1 + Y n-1 ; (n>0)
Trang 19Một số dạng giải thuật đệ quy đơn giản
Trang 20Một số bài toán giải bằng giải thuật đệ qui điển hình
Bài toán Tháp Hà Nội
Bài toán chia thưởng
Trang 21Bài toán tháp Hà Nội
Trang 22Bài toán tháp Hà Nội
Bài toán tháp Hà nội : n đĩa
A: cọc nguồn
B: cọc trung gian
Trang 23Bài toán tháp Hà Nội
Chuyển từ A sang C
Trường hợp n > 1
Chuyển (n-1) đĩa từ A sang B, C trung gian
Chuyển đĩa n từ A sang C
Chuyển (n-1) đĩa từ B sang C, A làm trung gian
Trang 24Bài toán tháp Hà Nội
Trang 25Bài toán tháp Hà Nội
A C, B trung gian
Trang 26Bài toán tháp Hà Nội
B C (A trung gian)
C (2)
Trang 27Bài toán tháp Hà Nội
A C (B trung gian)
A (n-2)
Trang 28Bài toán tháp Hà Nội
B C (A trung gian)
A (n-4)
Trang 29Bài toán tháp Hà Nội
A C
A (0)
Trang 30Bài toán tháp Hà Nội
Void HANOI(int n, char A,B,C){
Trang 31Bài toán chia thưởng
học sinh giỏi có thứ tự 1, 2, ,n thỏa nguyên tắc
Học sinh A giỏi hơn học sinh B, thì số phần thưởng của A
Trang 32Bài toán chia thưởng
Khi m < n, thì có n-m học sinh cuối không có
phần thưởng, Part(m,n) = Part(m,m)
Khi m>n, ta xét hai trường hợp
Khi học sinh cuối cùng không nhận được phần thưởng nào, dó đó Part(m,n) = Part(m, n-1)
Khi học sinh cuối cùng nhận được ít nhất 1 phần thưởng, do đó số cách chia là Part(m-n, n)
Tóm lại m > n, có Part(m,n) = Part(m, n-1) + Part(m-n, n)
Trang 33Bài toán chia thưởng
int PART( int m , int n )
Trang 34Phương pháp quay lui (back tracking)
Đặc trưng : là các bước hướng tới lời giải cuối
cùng của bài toán hoàn toàn được làm thử.
Nếu có một lựa chọn được chấp nhận thì ghi nhận lại lựa chọn này và tiến hành các bước thử tiếp theo
Ngược lại, không có lựa chọn nào thích hợp thì làm lại
bước trước, xóa bỏ sự ghi nhận và quay về chu trình thử các lựa chọn còn lại
Trang 35Phương pháp quay lui (back tracking)
Mô hình bài toán:
Tìm X=(x 1 , x 2 , ,x n ) thỏa B
Để chỉ ra lời giải X, ta phải dựng dần các thành phần lời giải x i
Trang 36Phương pháp quay lui (back tracking)
Phương pháp: Ta xây dựng x 1 , x 2 , ,x n theo cách
sau
Đầu tiên, Tập T 1 các ứng cử viên có thể là thành phần
đầu tiên của vectơ nghiệm chính là x 1
Trang 37Phương pháp quay lui (back tracking)
Nếu T k không rỗng, ta chọn x i T k và ta có được nghiệm bộ (x 1 ,x 2 ,…,x k-1 ,x k ), đồng thời loại x k đã chọn khỏi T k Sau đó ta lại tiếp tục mở rộng bộ (x 1 ,x 2 ,…,x k ) bằng cách áp dụng đệ quy thủ tục mở rộng nghiệm.
Nếu T k rỗng, tức là không thể mở rộng bộ (x 1 ,x 2 ,…,x k-2 ,x k-1 ), thì ta quay lại chọn phần tử mới x‟ k-1 trong T k-1 làm thành phần thứ k-1 của vectơ nghiệm
cũ cho bài toán” để hỗ trợ cho bước quay lui
Trang 38Phương pháp quay lui (back tracking)
Trang 39Phương pháp quay lui (back tracking)
Trang 40Liệt kê các hoán vị của n số tự nhiên đầu tiên
đầu tiên là một bộ x[0], x[1], ,x[n-1] Trong đó
x[i] x[j], i,j và x[i] {0 n-1}.
Trang 41Thu(int k){
if (k== n) inkq();
else for (int j=1; j<=n; j++)
if (b[j]) {
int main() {
b[j] = 1; // j=1 n-1 Thu (0);
Trang 42Liệt kê dãy nhị phân dộ dài n
Chuỗi nhị phân độ dài n có dạng x[0],
x[1], ,x[n-1], Đặt B={0,1}
T 1 =B, Giả sử đã xác định được x[0], x[1], , x[k-1] Thấy rằng T k = B
Trang 43Liệt kê dãy nhị phân dộ dài n
x[k] = j;
Thu(k+1);
} }
Trang 44Bài toán 8 quân xe
Trang 45Bài toán 8 quân xe
Đặt quân xe thứ i vào cột
thứ j sao cho nó không bị
„ăn‟ bởi i-1 quân xe hiện
có trên bàn cờ
Mỗi hàng chỉ có 1 quân xe,
Nên việc chọn vị trí quân
xe thứ i, chỉ nằm trên
hàng i
1 2 3 4 5 6 7 8
8 7 6 5 4 3 2 1
Trang 46Bài toán 8 quân xe
Qui ước x[i]: chỉ quân xe thứ i năm ở hàng i
X[i] = j, quân xe thứ i đặt ở cột j
Để quân xe i (hàng i) chấp nhận cột j, thì
cột j phải tự do.
Trang 47Bài toán 8 quân xe
Cột j
Hàng i
Trang 48Bài toán 8 quân xe
Do đó ta sẽ chọn các mảng Boole 1 chiều
để biểu diễn các trạng thái này
cột j
1<= i, j <=8
Trang 49Bài toán 8 quân xe
int x[8], a[8],
Với các dữ liệu đã cho, thì lệnh đặt quân
xe sẽ thể hiện bởi :
x[i] = j: đặt quân xe thứ i trên cột j.
a[j] = 0: Khi đặt xe tại cột j
Trang 50Bài toán 8 quân xe
Trang 51Bài toán 8 quân xe
Thu (i){
If (i >8)
Xuat (X) else
Trang 52Đệ quy và quy nạp toán học
Dùng đệ quy để giải các bài toán truy hồi
Dùng quy nạp toán học để chứng minh
tính đúng đắn, xác định độ phức tạp của
giải thuật đệ quy
Trang 53Q&A