Đệ quy (tiếng Anh: recursion) là phương pháp dùng trong các chương trình máy tính trong đó có một hàm tự gọi chính nó. rong toán học và khoa học máy tính, các tính chất (hoặc cấu trúc) được gọi là đệ quy nếu trong đó một lớp các đối tượng hoặc phương pháp được xác định bằng việc xác định một số rất ít các trường hợp hoặc phương pháp đơn giản (thông thường chỉ một) và sau đó xác định quy tắc đưa các trường hợp phức tạp về các trường hợp đơn giản....
Trang 1LOGO
GVGD: Tr ng Ph c H i
quy và
Thu t toán đ quy
2
N i dung
1 quy và gi i thu t đ quy
2 Stack và đ quy
3 Các lo i đ quy
5 K thu t tìm gi i thu t đ quy
3
nh ngh a đ quy:
K thu t đ nh ngh a m t khái ni m tr c ti p ho c gián ti p
d a vào chính nó
quy và gi i thu t đ quy
Trang 2
4
Gi i thu t đ quy là gi i thu t g i l i chính b n
thân nó nh ng th hi n đ n gi n h n
Gi i thu t đ quy đ c ng d ng đ chia nh bài
toán thành nh ng bài toán con cùng ki u d gi i
quy t h n
quy c ng có th đ c dùng đ thay th cho
vòng l p trong m t s tr ng h p
quy và gi i thu t đ quy
5
quy và gi i thu t đ quy
M t hàm đ quy g m 2 ph n
Ph n c s : cho giá tr đ n gi n ho c t m th ng c a bài
toán, đây là đi u ki n d ng c a đ quy
Ph n đ quy: ch a m t ho c nhi u l i g i đ n chính nó
nh ng v i tham s nh h n
6
Ví d
Tính giai th a N (v i N nguyên d ng)
{
}
quy và gi i thu t đ quy
Trang 37
N i dung
2 Stack và đ quy
3 Các lo i đ quy
5 K thu t tìm gi i thu t đ quy
8
Stack (ch ng) là m t c u trúc d li u đ c bi t có 2
thao tác c b n
Push: đ a ph n t vào đ u stack
Pop: l y ph n t đ u ra kh i stack
Nguyên lý ho t đ ng: L ast I n F irst O ut
Là linh h n c a đ quy
Stack và đ quy
1
2
3
4
9
Ví d đ quy tính giai th a:
int Fact( int N)
{
}
{
}
Stack và đ quy
m = 4*Fact(3) Fact(3) = 3*Fact(2) Fact(2) = 2*Fact(1) Fact(1) = 1
24
6
2
1
Trang 410
N i dung
2 Stack và đ quy
3 Các lo i đ quy
5 K thu t tìm gi i thu t đ quy
11
quy tuy n tính
Là hình th c đ n gi n nh t c a đ quy
Ch có t i đa m t l i g i đ n chính nó
vd: tính giai th a, l y th a, …
Các lo i đ quy
12
quy tuy n tính
Tính l y th a c a 2 s nguyên d ng a, N
{
}
Các lo i đ quy
Trang 5
13
quy tuy n tính
Tính t ng giá tr c a n ph n t thu c m ng A
int Sum( int A[], int n)
{
}
Các lo i đ quy
…
Sum(A, n) Sum(A, n-1)
14
quy tuy n tính
Ki m tra x có t n t i trong m ng A g m n ph n t nguyên
int IsExist( int A[], int n, int x)
{
}
Các lo i đ quy
…
IsExitst(A, n, x) IsExist(A, n-1, x)
15
quy tuy n tính
Tìm UCLN c a 2 s nguyên d ng a, b
int UCLN( int a, int b)
{
}
Các lo i đ quy
Trang 616
Có nhi u h n m t l i g i (th ng là 2 ho c 3 l i g i) đ n
chính nó
vd: tìm ph n t th n c a dãy Fibonacci, tính t
h p, bài toán tháp Hà N i, thu t toán tô màu hình
kín FloodFill, …
Các lo i đ quy
17
Tìm s Fibonacci th n (n nguyên d ng)
int F( int n)
{
}
Các lo i đ quy
18
Các lo i đ quy
Minh h a tìm s Fibonacci th 5
F(5)
1
1
1
1
1
1
1
1
2
3
2
2
5
3
8
Trang 719
Các lo i đ quy
Bài toán tháp Hà N i: chuy n 2 đ a t c t 1 sang c t 3
20
Các lo i đ quy
Bài toán tháp Hà N i: chuy n 2 đ a t c t 1 sang c t 3
21
Các lo i đ quy
Bài toán tháp Hà N i: chuy n N đ a t c t 1 sang c t 3
Company Logo
Trang 822
Các lo i đ quy
Bài toán tháp Hà N i: chuy n N đ a t c t 1 sang c t 3
Company Logo
23
Bài toán tháp Hà N i (chuy n N đ a t c t x sang c t y)
void Chuyen( int N, int x, int y)
{
cout<<"chuyen tu "<<x<<" sang "<<y<<endl;
}
Các lo i đ quy
24
Thu t toán tô màu hình kín (FloodFill)
Các lo i đ quy
Trang 925
quy phi tuy n
L i g i đ quy đ c th c hi n trong vòng l p
vd: cho dãy đ c đ nh ngh a
X 0 = 1
X n = n 2 X 0 + (n-1) 2 X 1 +…+X n-1
Yêu c u: tính giá tr c a X n
Các lo i đ quy
26
quy phi tuy n
Tính Xn = n2X0 + (n-1)2X1+…+Xn-1, bi t X0 = 1
double X( int N)
{
}
Các lo i đ quy
27
L i g i có s xoay vòng l n nhau, nh A g i B, B g i C, C
g i A, …
quy h t ng là đ quy r t ph c t p nh ng có nh ng
ng d ng r t lý thú, ch ng h n trong hình h c fractal
Các lo i đ quy
Trang 1028
Hãy tính Xn và Yn bi t dãy s đ c đ nh ngh a nh sau
Các lo i đ quy
29
double X( int N)
{
}
double Y( int N)
{
}
Các lo i đ quy
30
ng Hilbert:
Các lo i đ quy
Trang 1131
N i dung
2 Stack và đ quy
3 Các lo i đ quy
4 quy và hình h c fractal
5 K thu t tìm gi i thu t đ quy
32
ng Sierpinski tam giác
ng Sierpinski hình vuông
quy và hình h c fractal
33
ng Sierpinski các d ng khác
quy và hình h c fractal
Trang 1234
quy và hình h c fractal
35
N i dung
2 Stack và đ quy
3 Các lo i đ quy
5 K thu t tìm gi i thu t đ quy
36
Thông s hóa bài toán
Xác đ nh tham s truy n cho hàm đ quy
Xác đ nh c p (kích th c) c a bài toán
Tìm mô hình t ng quát đ thu nh bài toán
Thu nh bài toán theo kích th c
Tìm đi u ki n d ng c a đ quy
Tìm đi u ki n c a tr ng h p cho l i gi i t m th ng
K thu t tìm gi i thu t đ quy
Trang 1337
K thu t tìm gi i thu t đ quy
Ví d 1: cho n nguyên d ng, tính giá tr bi u th c
Thông s hóa bài toán: kích th c bài toán n
Mô hình t ng quát
ta có
i u ki n d ng: n = 1 thì S1 = 1
Company Logo
38
K thu t tìm gi i thu t đ quy
Gi i thu t minh h a
double S( int N)
{
}
Company Logo
39
Ví d 2: tính t ng giá tr N ph n t nguyên c a
m ng A
Thông s hóa bài toán: m ng A, N ph n t
Mô hình t ng quát: T ng(A, N) = T ng(A, N – 1) + A[N-1]
i u ki n d ng: N = 0 thì T ng = 0
K thu t tìm gi i thu t đ quy
Trang 1440
Gi i thu t minh h a
{
}
K thu t tìm gi i thu t đ quy
41
Ví d 3: áp d ng t t ng tìm ki m nh phân đ
tìm v trí xu t hi n c a s nguyên x trong m ng A
g m N ph n t nguyên
Thông s hóa: m ng A, đ u m ng, cu i m ng, giá tr x
Mô hình t ng quát:
A[gi a] = x: tìm thành công
A[gi a] < x: tìm t đ u = gi a + 1 đ n cu i
x < A[gi a]: tìm t đ u đ n cu i = gi a - 1
i u ki n d ng: đ u > cu i
K thu t tìm gi i thu t đ quy
42
Gi i thu t minh h a
int BinSearch( int A[], int l, int r, int x)
{
}
K thu t tìm gi i thu t đ quy
Trang 1543
Ví d 4: cho s nguyên d ng N ≤ 1000 Vi t hàm
đ quy bi u di n nh phân c a N
Thông s hóa: s nguyên N
Mô hình t ng quát:
a giá tr N % 2 vào stack
G i đ quy v i c p N/2
i u ki n d ng: N = 0
K thu t tìm gi i thu t đ quy
44
Gi i thu t minh h a
{
}
Minh h a g i
BinConvert(11)
K thu t tìm gi i thu t đ quy
BinConvert(11) BinConvert(5) BinConvert(2) BinConvert(1)
1 0 1 1
11 = 10 2
11 % 2 = 1
5 % 2 = 1
2 % 2 = 0
1 % 2 = 1