19/08/2011
1
LOGO
GVGD: Trng Phc Hi
quy và
Thut toán đ quy
2
Ni dung
1. quy và gii thut đ quy
2. Stack và đ quy
3. Các loi đ quy
4. quy và hình hc fractal
5. K thut tìm gii thut đ quy
3
nh ngha đ quy:
K thut đnh ngha mt khái nim trc tip hoc gián tip
da vào chính nó.
quy và gii thut đ quy
19/08/2011
2
4
Gii thut đ quy là gii thut gi li chính bn
thân nó nhng th hin đn gin hn
Gii thut đ quy đc ng dng đ chia nh bài
toán thành nhng bài toán con cùng kiu d gii
quyt hn
quy cng có th đc dùng đ thay th cho
vòng lp trong mt s trng hp
quy và gii thut đ quy
5
quy và gii thut đ quy
Mt hàm đ quy gm 2 phn
Phn c s: cho giá tr đn gin hoc tm thng ca bài
toán, đây là điu kin dng ca đ quy
Phn đ quy: cha mt hoc nhiu li gi đn chính nó
nhng vi tham s nh hn
6
Ví d
Tính giai tha N (vi N nguyên dng)
int Factorial(int N)
{
if (N <= 1) //điu kin dng
return 1;
return N*Factorial(N-1); //li gi đ quy
}
quy và gii thut đ quy
19/08/2011
3
7
Ni dung
1. quy và gii thut đ quy
2. Stack và đ quy
3. Các loi đ quy
4. quy và hình hc fractal
5. K thut tìm gii thut đ quy
8
Stack (chng) là mt cu trúc d liu đc bit có 2
thao tác c bn
Push: đa phn t vào đu stack
Pop: ly phn t đu ra khi stack
Nguyên lý hot đng:
Last In First Out
Là linh hn ca đ quy
Stack và đ quy
1
2
3
4
9
Ví d đ quy tính giai tha:
int Fact(int N)
{
if (N <= 1)
return 1;
return N*Fact(N-1);
}
void main()
{
int n = 4;
int m = Fact(n);
cout<<m;
getch();
}
Stack và đ quy
m = 4*Fact(3)
Fact(3) = 3*Fact(2)
Fact(2) = 2*Fact(1)
Fact(1) = 1
24
6
2
1
19/08/2011
4
10
Ni dung
1. quy và gii thut đ quy
2. Stack và đ quy
3. Các loi đ quy
4. quy và hình hc fractal
5. K thut tìm gii thut đ quy
11
quy tuyn tính
Là hình thc đn gin nht ca đ quy
Ch có ti đa mt li gi đn chính nó
vd: tính giai tha, ly tha, …
Các loi đ quy
12
quy tuyn tính
Tính ly tha ca 2 s nguyên dng a, N
int Power(int a, int N)
{
if (N == 0)
return 1;
return a*Power(a, N-1);
}
Các loi đ quy
19/08/2011
5
13
quy tuyn tính
Tính tng giá tr ca n phn t thuc mng A
int Sum(int A[], int n)
{
if (n == 0)
return 0;
return Sum(A, n – 1) + A[n - 1];
}
Các loi đ quy
0 1 2 3 n-2 n-1
…
Sum(A, n)
Sum(A, n-1)
14
quy tuyn tính
Kim tra x có tn ti trong mng A gm n phn t nguyên
int
IsExist(int A[], int n, int x)
{
if (n == 0) return 0;
if (A[n – 1] == x) return 1;
return IsExists(A, n – 1, x);
}
Các loi đ quy
0 1 2 3 n-2 n-1
…
IsExitst(A, n, x)
IsExist(A, n-1, x)
15
quy tuyn tính
Tìm UCLN ca 2 s nguyên dng a, b
int
UCLN(int a, int b)
{
if (a == b) return a;
if (a > b) return UCLN(a – b, b);
return UCLN(a, b - a);
}
Các loi đ quy
19/08/2011
6
16
quy nhánh
Có nhiu hn mt li gi (thng là 2 hoc 3 li gi) đn
chính nó
vd: tìm phn t th n ca dãy Fibonacci, tính t
hp, bài toán tháp Hà Ni, thut toán tô màu hình
kín FloodFill, …
Các loi đ quy
17
quy nhánh
Tìm s Fibonacci th n (n nguyên dng)
int F(int n)
{
if (n <= 1)
return 1;
return F(n - 2) + F(n - 1);
}
Các loi đ quy
18
Các loi đ quy
quy nhánh
Minh ha tìm s Fibonacci th 5
F(5)
F(3) F(4)
F(1) F(2) F(2) F(3)
F(0) F(1) F(0) F(1) F(1) F(2)
F(0) F(1)
1 1
1 1 1 1 1
1
2
3
2 2
5
3
8
19/08/2011
7
19
Các loi đ quy
quy nhánh
Bài toán tháp Hà Ni: chuyn 2 đa t ct 1 sang ct 3
1 2 3
20
Các loi đ quy
quy nhánh
Bài toán tháp Hà Ni: chuyn 2 đa t ct 1 sang ct 3
1 2 3
21
Các loi đ quy
quy nhánh
Bài toán tháp Hà Ni: chuyn N đa t ct 1 sang ct 3
Company Logo
1 2 3
19/08/2011
8
22
Các loi đ quy
quy nhánh
Bài toán tháp Hà Ni: chuyn N đa t ct 1 sang ct 3
Company Logo
1 2 3
23
quy nhánh
Bài toán tháp Hà Ni (chuyn N đa t ct x sang ct y)
void Chuyen(int N, int x, int y)
{
if (N == 1)
cout<<
"chuyen tu "<<x<<" sang "<<y<<endl;
else
{
Chuyen(N – 1, x, 6 – x - y);
Chuyen(1, x, y);
Chuyen(N – 1, 6 – x – y, y);
}
}
Các loi đ quy
24
quy nhánh
Thut toán tô màu hình kín (FloodFill)
Các loi đ quy
19/08/2011
9
25
quy phi tuyn
Li gi đ quy đc thc hin trong vòng lp
vd: cho dãy đc đnh ngha
X
0
= 1
X
n
= n
2
X
0
+ (n-1)
2
X
1
+…+X
n-1
Yêu cu: tính giá tr ca X
n
Các loi đ quy
26
quy phi tuyn
Tính X
n
= n
2
X
0
+ (n-1)
2
X
1
+…+X
n-1
, bit X
0
= 1
double X(int N)
{
if (N == 0)
return 1;
double s = 0;
for (int i = 0; i < N; i++)
s = s + (N – i)*(N – i)*X(i);
return s;
}
Các loi đ quy
27
quy h tng
Li gi có s xoay vòng ln nhau, nh A gi B, B gi C, C
gi A, …
quy h tng là đ quy rt phc tp nhng có nhng
ng dng rt lý thú, chng hn trong hình hc fractal
Các loi đ quy
19/08/2011
10
28
quy h tng
Hãy tính X
n
và Y
n
bit dãy s đc đnh ngha nh sau
Các loi đ quy
29
quy h tng
double
X(int N);
double Y(int N);
double
X(int N)
{
if (N == 0) return 1;
return X(N – 1) + Y(N – 1);
}
double Y(int N)
{
if (N == 0) return 1;
return X(N – 1) * Y(N - 1);
}
Các loi đ quy
30
quy h tng
ng Hilbert:
Các loi đ quy
19/08/2011
11
31
Ni dung
1. quy và gii thut đ quy
2. Stack và đ quy
3. Các loi đ quy
4. quy và hình hc fractal
5. K thut tìm gii thut đ quy
32
ng Sierpinski tam giác
ng Sierpinski hình vuông
quy và hình hc fractal
33
ng Sierpinski các dng khác
quy và hình hc fractal
19/08/2011
12
34
quy và hình hc fractal
35
Ni dung
1. quy và gii thut đ quy
2. Stack và đ quy
3. Các loi đ quy
4. quy và hình hc fractal
5. K thut tìm gii thut đ quy
36
Thông s hóa bài toán
Xác đnh tham s truyn cho hàm đ quy
Xác đnh cp (kích thc) ca bài toán
Tìm mô hình tng quát đ thu nh bài toán
Thu nh bài toán theo kích thc
Tìm điu kin dng ca đ quy
Tìm điu kin ca trng hp cho li gii tm thng
K thut tìm gii thut đ quy
19/08/2011
13
37
K thut tìm gii thut đ quy
Ví d 1: cho n nguyên dng, tính giá tr biu thc
Thông s hóa bài toán: kích thc bài toán n
Mô hình tng quát
t
và
ta có
iu kin dng: n = 1 thì S
1
= 1
Company Logo
38
K thut tìm gii thut đ quy
Gii thut minh ha
double S(int N)
{
if (N == 1)
return 1;
return S(N – 1) + 1/(n*n);
}
Company Logo
39
Ví d 2: tính tng giá tr N phn t nguyên ca
mng A
Thông s hóa bài toán: mng A, N phn t
Mô hình tng quát: Tng(A, N) = Tng(A, N – 1) + A[N-1]
iu kin dng: N = 0 thì Tng = 0
K thut tìm gii thut đ quy
19/08/2011
14
40
Gii thut minh ha
int Sum(int A[], int N)
{
if (N == 0)
return 0;
return Sum(A, N – 1) + A[N – 1];
}
K thut tìm gii thut đ quy
41
Ví d 3: áp dng t tng tìm kim nh phân đ
tìm v trí xut hin ca s nguyên x trong mng A
gm N phn t nguyên
Thông s hóa: mng A, đu mng, cui mng, giá tr x
Mô hình tng quát:
A[gia] = x: tìm thành công
A[gia] < x: tìm t đu = gia + 1 đn cui
x < A[gia]: tìm t đu đn cui = gia - 1
iu kin dng: đu > cui
K thut tìm gii thut đ quy
42
Gii thut minh ha
int BinSearch(int A[], int l, int r, int x)
{
if (l > r)
return -1;
int m = (l + r)/2;
if (A[m] == x)
return m;
if (A[m] < x)
return BinSearch(A, m + 1, r, x);
return BinSearch(A, l, m - 1, x);
}
K thut tìm gii thut đ quy
19/08/2011
15
43
Ví d 4: cho s nguyên dng N ≤ 1000. Vit hàm
đ quy biu din nh phân ca N
Thông s hóa: s nguyên N
Mô hình tng quát:
a giá tr N % 2 vào stack
Gi đ quy vi cp N/2
iu kin dng: N = 0
K thut tìm gii thut đ quy
44
Gii thut minh ha
void BinConvert(int N)
{
if (N != 0)
{
BinConvert(N/2);
cout<<N % 2;
}
}
Minh ha gi
BinConvert(11)
K thut tìm gii thut đ quy
BinConvert(11)
BinConvert(5)
BinConvert(2)
BinConvert(1)
1 0 1 1 11 =
2 10
11 % 2 = 1
5 % 2 = 1
2 % 2 = 0
1 % 2 = 1