19/08/2011
quy và
Thu t toán đ
quy
GVGD: Tr
ng Ph
cH i
LOGO
N i dung
1.
quy và gi i thu t đ
quy
2. Stack và đ quy
3. Các lo i đ
4.
quy
quy và hình h c fractal
5. K thu t tìm gi i thu t đ quy
2
quy và gi i thu t đ
nh ngh a đ
quy
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ó.
3
1
19/08/2011
quy và gi i thu t đ
quy
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 đ
vòng l p trong m t s tr ng h p
thay th
cho
4
quy và gi i thu t đ
M t hàm đ
quy
quy g m 2 ph n
Ph n c s : cho giá tr đ n gi n ho c t m th
toán, đây là đi u ki n d ng c a đ quy
ng c a bài
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
5
quy và gi i thu t đ
quy
Ví d
Tính giai th a N (v i N nguyên d
ng)
int Factorial(int N)
{
if (N <= 1) //đi u ki n d ng
return 1;
return N*Factorial(N-1); //l i g i đ
}
quy
6
2
19/08/2011
N i dung
1.
quy và gi i thu t đ
quy
2. Stack và đ quy
3. Các lo i đ
4.
quy
quy và hình h c fractal
5. K thu t tìm gi i thu t đ quy
7
Stack và đ
quy
Stack (ch ng) là m t c u trúc d
thao tác c b n
li u đ c bi t có 2
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: Last In First Out
Là linh h n c a đ quy
4
3
2
1
8
Stack và đ
Ví d
quy
đ quy tính giai th a:
int Fact(int N)
{
if (N <= 1)
return 1;
return N*Fact(N-1);
}
void main()
{
int n = 4;
int m = Fact(n);
cout<
getch();
}
Fact(1) = 1
1
Fact(2) = 2*Fact(1)
2
Fact(3) = 3*Fact(2)
6
m = 4*Fact(3)
24
9
3
19/08/2011
N i dung
1.
quy và gi i thu t đ
quy
2. Stack và đ quy
3. Các lo i đ
4.
quy
quy và hình h c fractal
5. K thu t tìm gi i thu t đ quy
10
Các lo i đ
quy
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, …
11
Các lo i đ
quy
quy tuy n tính
Tính l y th a c a 2 s nguyên d
ng a, N
int Power(int a, int N)
{
if (N == 0)
return 1;
return a*Power(a, N-1);
}
12
4
19/08/2011
Các lo i đ
quy
quy tuy n tính
Tính t ng giá tr c a n ph n t
0
1
2
thu c m ng A
3
n-2
n-1
…
Sum(A, n-1)
Sum(A, n)
int Sum(int A[], int n)
{
if (n == 0)
return 0;
return Sum(A, n – 1) + A[n - 1];
}
13
Các lo i đ
quy
quy tuy n tính
Ki m tra x có t n t i trong m ng A g m n ph n t
0
1
2
3
n-2
nguyên
n-1
…
IsExist(A, n-1, x)
IsExitst(A, n, x)
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);
}
14
Các lo i đ
quy
quy tuy n tính
Tìm UCLN c a 2 s nguyên d
ng 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);
}
15
5
19/08/2011
Các lo i đ
quy
quy nhánh
Có nhi u h n m t l i g i (th
chính nó
ng là 2 ho c 3 l i g i) đ 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, …
16
Các lo i đ
quy
quy nhánh
Tìm s Fibonacci th
n (n nguyên d
ng)
int F(int n)
{
if (n <= 1)
return 1;
return F(n - 2) + F(n - 1);
}
17
Các lo i đ
quy
quy nhánh
Minh h a tìm s Fibonacci th
5
F(5)
8
F(3)
F(4)
3
5
F(1)
F(2)
F(2)
1
2
2
F(3)
3
F(0)
F(1)
F(0)
F(1)
F(1)
1
1
1
1
1
F(2)
2
F(0)
F(1)
1
1
18
6
19/08/2011
Các lo i đ
quy
quy nhánh
Bài toán tháp Hà N i: chuy n 2 đ a t
1
2
c t 1 sang c t 3
3
19
Các lo i đ
quy
quy nhánh
Bài toán tháp Hà N i: chuy n 2 đ a t
1
2
c t 1 sang c t 3
3
20
Các lo i đ
quy
quy nhánh
Bài toán tháp Hà N i: chuy n N đ a t
1
Company Logo
2
c t 1 sang c t 3
3
21
7
19/08/2011
Các lo i đ
quy
quy nhánh
Bài toán tháp Hà N i: chuy n N đ a t
1
Company Logo
Các lo i đ
2
c t 1 sang c t 3
3
22
quy
quy nhánh
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)
{
if (N == 1)
cout<<"chuyen tu "<
else
{
Chuyen(N – 1, x, 6 – x - y);
Chuyen(1, x, y);
Chuyen(N – 1, 6 – x – y, y);
}
}
23
Các lo i đ
quy
quy nhánh
Thu t tốn tơ màu hình kín (FloodFill)
24
8
19/08/2011
Các lo i đ
quy
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
X0 = 1
Xn = n2X0 + (n-1)2X1+…+Xn-1
Yêu c u: tính giá tr c a Xn
25
Các lo i đ
quy
quy phi tuy n
Tính Xn = n2X0 + (n-1)2X1+…+Xn-1, bi t X0 = 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;
}
26
Các lo i đ
quy h
t
L i g i có s
g i A, …
quy
ng
xoay vịng l n nhau, nh
A g i B, B g i C, C
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
27
9
19/08/2011
Các lo i đ
quy h
t
quy
ng
Hãy tính Xn và Yn bi t dãy s đ
c đ nh ngh a nh
sau
28
Các lo i đ
quy h
t
quy
ng
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);
}
29
Các lo i đ
quy h
t
quy
ng
ng Hilbert:
30
10
19/08/2011
N i dung
1.
quy và gi i thu t đ
quy
2. Stack và đ quy
3. Các lo i đ
4.
quy
quy và hình h c fractal
5. K thu t tìm gi i thu t đ quy
31
quy và hình h c fractal
ng Sierpinski tam giác
ng Sierpinski hình vng
32
quy và hình h c fractal
ng Sierpinski các d ng khác
33
11
19/08/2011
quy và hình h c fractal
34
N i dung
1.
quy và gi i thu t đ
quy
2. Stack và đ quy
3. Các lo i đ
4.
quy
quy và hình h c fractal
5. K thu t tìm gi i thu t đ quy
35
K thu t tìm gi i thu t đ
Thơng s
hóa bài tố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 tốn
Tìm mơ hình t ng qt đ
quy
thu nh
Thu nh bài tốn theo kích th
bài tốn
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
36
12
19/08/2011
K thu t tìm gi i thu t đ
Ví d
1: cho n nguyên d
ng, tính giá tr bi u th c
Thơng s hóa bài tốn: kích th
Mơ hình t ng qt
t
quy
c bài tốn n
và
ta có
i u ki n d ng: n = 1 thì S1 = 1
Company Logo
37
K thu t tìm gi i thu t đ
quy
Gi i thu t minh h a
double S(int N)
{
if (N == 1)
return 1;
return S(N – 1) + 1/(n*n);
}
Company Logo
38
K thu t tìm gi i thu t đ
Ví d 2: tính t ng giá tr N ph n t
m ng A
quy
nguyên c a
Thông s hóa bài tốn: m ng A, N ph n t
Mơ hình t ng qt: T ng(A, N) = T ng(A, N – 1) + A[N-1]
i u ki n d ng: N = 0 thì T ng = 0
39
13
19/08/2011
K thu t tìm gi i thu t đ
quy
Gi i thu t minh h a
int Sum(int A[], int N)
{
if (N == 0)
return 0;
return Sum(A, N – 1) + A[N – 1];
}
40
K thu t tìm gi i thu t đ
quy
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 ngun
Thơng s hóa: m ng A, đ u m ng, cu i m ng, giá tr x
Mơ hình t ng qt:
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
41
K thu t tìm gi i thu t đ
quy
Gi i thu t minh h a
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);
}
42
14
19/08/2011
K thu t tìm gi i thu t đ
quy
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 ngun 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
43
K thu t tìm gi i thu t đ
quy
Gi i thu t minh h a
void BinConvert(int N)
{
if (N != 0)
{
BinConvert(N/2);
cout<
}
}
BinConvert(1)
Minh h a g i
BinConvert(11)
BinConvert(2)
BinConvert(5)
BinConvert(11)
1%2=1
2%2=0
5%2=1
11 % 2 = 1
1110= 1 0 1 1 2
44
15