Tải bản đầy đủ (.pdf) (52 trang)

Cấu trúc dữ liệu và giải thuật-Chương 2: Giải thuật đệ quy pot

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (521.2 KB, 52 trang )

Cấutrúcdữ liệuvàgiải thuật
Người thực hiện: Đỗ Tuấn Anh
Email:
ĐT: 0989095167
Nộidung
z Chương 1 – Thiếtkế và phân tích (5 tiết)
z Chương 2 – Giảithuật đệ quy (10 tiết)
z Chương 3 – Mảng và danh sách (5 tiết)
z Chương 4 – Ngănxếp và hàng đợi (10 tiết)
z Chương 5 – Cấu trúc cây (10 tiết)
z Chương 8 – Tìm kiếm(5 tiết)
z Chương 7 – Sắpxếp (10 tiết)
z Chương 6 – Đồ thị (5 tiết)
Chương 2 – Giảithuật đệ quy
1. Khái niệm
2. Thiếtkế giảithuật đệ quy
3. Hiệulựccủa đệ quy
4. Đệ quy và quy nạp toán học
5. Đệ quy quay lui
1. Khái niệm
z Là mộtkỹ thuậtgiải quyết bài toán quan
trọng trong đó:
{Phân tích đốitượng thành các thành phầnnhỏ
hơn mang tính chấtcủa chính đốitượng đó.
z Ví dụ:
{Định nghĩasố tự nhiên:
z1 là mộtsố tự nhiên
zx là mộtsố tự nhiên nếux-1 làmộtsố tự nhiên
Ví dụ 1 - Tính giai thừa
z Hàm tính giai thừachomộtsố nguyên:
z Định nghĩa đệ quy:


n! =
1 if n = 0 // điềukiệndừng
n * ( n - 1)! if n > 0 // bước đệ quy
n! = n * ( n -1 ) * …* 1
Tính giai thừa
z Định nghĩa đệ quy chỉ ra một cách chính
xác cách tính giai thừa
4! = 4 * 3! // Bước đệ quy (n = 4)
= 4 * ( 3 * 2! ) // Bước đệ quy (n = 3)
= 4 * ( 3 * ( 2 * 1!) ) // Bước đệ quy (n = 2)
= 4 * ( 3 * ( 2 * ( 1 * 0! ) ) ) // Bước đệ quy (n = 1)
= 4 * ( 3 * ( 2 * ( 1 * 1 ) ) ) // Điềukiệndừng ( n = 0)
= 4 * ( 3 * ( 2 * 1 ) )
= 4 * ( 3 * 2 )
= 4 * 6
= 24
1. Khái niệm(tiếp)
z Giảithuật đệ quy: T đượcthựchiệnbằng T’ có
dạng giống như T
z Giảithuật đệ quy phảithỏa mãn 2 điềukiện:
{Phảicóđiểmdừng: là trường hợpcơ sở (suy biến) nhỏ
nhất, đượcthựchiện không cần đệ quy
{Phảilàmchokíchthước bài toán thu nhỏ hơn: do đó
làm cho bài toán giảmdần đếntrường
hợpcơ sở
z Thủ tục đệ quy:
{Có lờigọi đến chính nó (đệ quy trựctiếp) hoặcchứalời
gọi đếnthủ tục khác và thủ tục này chứalờigọi đếnnó
(đệ quy gián tiếp)
{Sau mỗilầngọi, kích thước bài toán thu nhỏ hơn

{Phảikiểmtrađiểmdừng
Giảithuật đệ quy – ví dụ
z Tìm file trong thư mục trên máy tính
z Tra từ trong từđiển Anh-Anh
2. Thiếtkế giảithuật đệ quy
z 3 bước:
{Thông số hóa bài toán
{Tìm điềukiệndừng
{Phân rã bài toán
z Ví dụ bài toán: Tính N!
Bước 1: Thông số hóa bài toán
z Tìm các thông số biểuthị kích thướccủa
bài toán
z Quyết định độ phứctạpcủa bài toán
z Ví dụ: Tính N!
{ N trong hàm tính giai thừacủaN
Bước2: Tìmđiềukiệndừng
z Là trường hợpgiải không đệ quy
z Là trường hợpkíchthước bài toán nhỏ
nhất
z Ví dụ: Tính N!
{ 0! = 1
Bước 3: Phân rã bài toán
z Phân rã bài toán thành các thành phần:
{ Hoặc không đệ quy
{ Hoặc là bài toán trên nhưng kích thướcnhỏ
hơn
z Bài toán viết đượcdướidạng công thức
đệ quy => đơngiản
z Ví dụ: Tính N!

{ N! = N * (N-1)!
Chương trình tính giai thừa
// Sử dụng đệ quy
long Factorial (long n)
{
// điềukiệndừng n == 0
if (n == 0)
return 1;
else // bước đệ quy
return n * Factorial (n-1);
}
Quan điểmN-máy
Hàm tính giai thừa(n) cóthểđược xem nhưđược
thựchiệnbởin-máy:
Máy 4 (4 * 3!) khởi động máy 3
Máy 3 (3 * 2!) khởi động máy 2
Máy 2 (2 * 1!) khởi động máy 1
Máy 1 (1 * 0!) khởi động máy 0
4 * 3!
4! = 24
2 * 1!
2! = 2
0! = 1
1 * 0!
1! = 1
3 * 2!
3! = 6
4! 3! 2! 1! 0!
KĐ KĐ
KĐ KĐ

112
6
24
Factorial(4)
Factorial(3)4
3
Factorial(2)
Factorial(0)
2
Factorial(1)
1
*
*
*
*
1
1
2
6
24
Điềukiện đệ quy
Phảicóđiểmdừng: nếu không sẽ tạo thành một
chuỗivôhạn các lờigọihàm
long Factorial(long n){
return n * Factorial(n-1);
}
Phải làm cho bài toán đơngiảnhơn:
long Factorial(long n){
if (n==0)
return 1;

else
return n * Factorial(n+1);
}
Oops!
Oops!
Không
Không
c
c
ó
ó
đi
đi


m
m
d
d


ng
ng
Oops!
Oops!
Dãy số Fibonacci
zDãy số Fibonacci:
0, 1, 1, 2, 3, 5, 8, 13, 21, 34,
trong đómỗisố là tổng của2 sốđứng
trước nó.

z Định nghĩa theo đệ quy:
{F(0) = 0;
{F(1) = 1;
{F(n) = F(n-1)+ F(n-2);
Dãy số Fibonacci – Thủ tục đệ quy
//Tính số Fibonacci sử dụng hàm đệ quy.
int fib(int number)
{
if (number == 0) return 0;
if (number == 1) return 1;
return (fib(number-1) + fib(number-2));
}
int main(){
int inp_number;
printf ("Please enter an integer: “);
scanf (“%d”, &inp_number);
int intfib = fib(inp_number);
printf("The Fibonacci number for %d is %d\n“,inp_number,intfib);
return 0;
}
Cơ chế thựchiện
z Tính fibonacci của 4, num=4:
fib(4):
4 == 0 ? Sai; 4 == 1? Sai.
fib(4) = fib(3) + fib(2)
fib(3):
3 == 0 ? Sai; 3 == 1? Sai.
fib(3) = fib(2) + fib(1)
fib(2):

2 == 0? Sai; 2==1? Sai.
fib(2) = fib(1)+fib(0)
fib(1):
1== 0 ? Sai;
1 == 1? Đúng.
fib(1) = 1;
return fib(1)
;
int fib(int num)
{
if (num == 0) return 0;
if (num == 1) return 1;
return
(fib(num-1)+fib(num-2));
}
Cơ chế thựchiện
fib(0):
0 == 0 ? Đúng.
fib(0) = 0;
return fib(0);
fib(2) = 1 + 0 = 1;
return fib(2);
fib(3) = 1 + fib(1)
fib(1):
1 == 0 ? Sai;
1 == 1? Đúng
fib
(1) = 1;
return fib
(1);

fib(3) = 1 + 1 = 2;
return fib(3)
Cơ chế thựchiện
fib(2):
2 == 0 ? Sai; 2 == 1? Sai.
fib(2) = fib(1) + fib(0)
fib(1):
1== 0 ? Sai; 1 == 1? Đúng.
fib(1) = 1;
return fib(1);
fib(0):
0 == 0 ? Đúng.
fib(0) = 0;
return fib(0);
fib(2) = 1 + 0 = 1;
return fib(2);
fib(4) = fib(3) + fib(2)
= 2 + 1 = 3;
return fib(4);
Thủ tục đệ quy tổng quát
int Hàm_đệ_quy(DS tham số){
if(thỏa mãn điềukiệndừng)
return giá_trị_dừng_tương_ứng;
// other stopping conditions if needed
return hàm_đệ_quy(tham số suy giảm)
}
BàitoánthápHàNội
Ban đầu:
Cột1
Kếtthúc:

Cột2 Cột3
Cột1 Cột2 Cột3
Quy tắc: đĩalớnhơn không được đặttrênđĩanhỏ hơn trong quá trình
chuyển đĩa
Giảithuật đệ quy
1. Chuyển n –1 đĩatừ cột 1 sang cột2
2. Chuyển đĩadưới cùng từ cột 1 sang 3
3. Chuyểnn-1 đĩatừ cột2 sang cột3
1 2
3
1
2
3
2
1
3

×