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

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

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

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



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



×