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

Đệ quy và thuật toán đệ quy pps

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 (412.99 KB, 15 trang )

19/08/2011
1
LOGO
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
4.  quy và hình hc fractal
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


  
   





  
  



 

19/08/2011
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)




  
     


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
}
 quy và gii thut đ quy
19/08/2011
3
7
Ni dung
1.  quy và gii thut đ quy
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
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:
Last In First Out

 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)
{
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
Ni dung
1.  quy và gii thut đ quy
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
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


int Power(int a, int N)
{
if (N == 0)

return 1;

return a*Power(a, N-1);

}
Các loi đ quy




 
  



19/08/2011
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)
{

if (n == 0)

return 0;

return Sum(A, n – 1) + A[n - 1];

}
Các loi đ quy
0 1 2 3 n-2 n-1

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)
{

if (n == 0) return 0;

if (A[n – 1] == x) return 1;

return IsExists(A, n – 1, x);

}
Các loi đ quy
0 1 2 3 n-2 n-1

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)
{
if (a == b) return a;

if (a > b) return UCLN(a – b, b);

return UCLN(a, b - a);

}
Các loi đ quy
19/08/2011
6
16
  quy nhánh

 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
  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);

}

Các loi đ quy
18
Các loi đ quy

  quy nhánh

 Minh ha 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 loi đ quy
  quy nhánh

 Bài toán tháp Hà Ni: chuyn 2 đa t ct 1 sang ct 3
1 2 3
20
Các loi đ quy
  quy nhánh

 Bài toán tháp Hà Ni: chuyn 2 đa t ct 1 sang ct 3

1 2 3
21
Các loi đ quy
  quy nhánh

 Bài toán tháp Hà Ni: chuyn N đa t ct 1 sang ct 3
Company Logo
1 2 3
19/08/2011
8
22
Các loi đ quy
  quy nhánh

 Bài toán tháp Hà Ni: chuyn N đa t ct 1 sang ct 3
Company Logo
1 2 3
23
  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 "<<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 loi đ quy
24
  quy nhánh

 Thut toán tô màu hình kín (FloodFill)
Các loi đ quy
19/08/2011
9
25
  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 X
n
= n
2
X
0
+ (n-1)
2
X
1
+…+X
n-1
, bit 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 loi đ quy
27
  quy h tng

 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
19/08/2011
10
28
  quy h tng

 Hãy tính X
n

và Y
n
bit dãy s đc đnh ngha nh sau












 





 



Các loi đ quy
29
  quy h t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);
}

Các loi đ quy
30
  quy h tng

 ng Hilbert:

Các loi đ quy
19/08/2011
11
31
Ni dung

1.  quy và gii thut đ quy
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
19/08/2011
12
34
 quy và hình hc fractal
35
Ni dung
1.  quy và gii thut đ quy
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
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
19/08/2011
13
37
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


t 

 







  



và 

 








  




ta có 









 iu kin dng: n = 1 thì S
1
= 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)
{
if (N == 1)

return 1;


return S(N – 1) + 1/(n*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
19/08/2011
14
40
 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];
}
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)
{
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 thut tìm gii thut đ quy
19/08/2011
15
43
 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

void BinConvert(int N)
{
if (N != 0)
{
BinConvert(N/2);
cout<<N % 2;
}
}


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 =
2 10
11 % 2 = 1
5 % 2 = 1
2 % 2 = 0
1 % 2 = 1

×