Вы находитесь на странице: 1из 65

Chng 2:

HM - QUY
(Function - Recursion)
NI DUNG
1. Hm (function)
2. Khi nim ngn xp (stack)
3. Qu trnh thc thi hm
4. Tham s hm
5. Bin ton cc (global) v cc b (local)
6. quy (recursion)
7. Cc loi quy (types of recursion)
2
Chng 2: Hm quy
1. Hm
kh nng lp trnh theo modul
chia nh thao tc
trnh lp li mt thao tc
#include <iostream.h>
int add (int x, int y)
{
int z;
z = x + y;
return (z);
}
void main ()
{
int i, j, k;
i = 10;
j = 20;
k = add(i, j);
cout<<"The value of k is"<<k;
}
3
NI DUNG
1. Hm (function)
2. Khi nim ngn xp (stack)
3. Qu trnh thc thi hm
4. Tham s hm
5. Bin ton cc (global) v cc b (local)
6. quy (recursion)
7. Cc loi quy (types of recursion)
4
Chng 2: Hm quy
2. Khi nim ngn xp (stack)
Stack l phn b nh m trong cc gi tr ca n
c lu vo (Push) v ly ra (Pop) theo kiu last in
first out
5
NI DUNG
1. Hm (function)
2. Khi nim ngn xp (stack)
3. Qu trnh thc thi hm
4. Tham s hm
5. Bin ton cc (global) v cc b (local)
6. quy (recursion)
7. Cc loi quy (types of recursion)
6
Chng 2: Hm quy
3. Qu trnh thc thi hm
Khi hm c gi, v tr lnh hin ti s tm thi b
dng v iu khin s chy n hm c gi
Sau khi hm c thc thi xong, iu khin s quay
tr v v tr b dng tm thi thi hnh tip
bit c chnh xc v tr quay tr v, my tnh
s lu a ch ca lnh k tip lc b dng vo stack
Nh vy:
Trc khi thc thi hm, my tnh s lu (Push) a ch
lnh k tip vo stack
Khi hm c thc thi xong, my tnh s ly (Pop) a ch
ra thc hin tip
7
Chng 2: Hm quy
3. Qu trnh thc thi hm
Kt qu???
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
8
NI DUNG
1. Hm (function)
2. Khi nim ngn xp (stack)
3. Qu trnh thc thi hm
4. Tham s hm
5. Bin ton cc (global) v cc b (local)
6. quy (recursion)
7. Cc loi quy (types of recursion)
9
Chng 2: Hm quy
4. Tham s hm
1. Tham s hm l tham tr (value):
gi tr tham s truyn trc v sau khi gi hm l nh
nhau

2. Tham s hm l tham chiu (reference):
gi tr tham s truyn s c thay i sau khi gi hm

10
4. Tham s hm
void f1 (int k)
{
k = k + 10;
}

void main( )
{
int i;
i = 0;
cout<<Gia tri i truoc khi goi ham
"<< i<<"\n";
f1(i);
cout<<"Gia tri i sau khi goi ham
"<< i<<\n";
}
void f1 (int &k)
{
k = k + 10;
}

void main( )
{
int i;
i = 0;
cout<<"Gia tri i truoc khi goi ham
"<< i<<"\n";
f1(i);
cout<<"Gia tri i sau khi goi ham
"<< i<<\n";
}
11
NI DUNG
1. Hm (function)
2. Khi nim ngn xp (stack)
3. Qu trnh thc thi hm
4. Tham s hm
5. Bin ton cc (global) v cc b (local)
6. quy (recursion)
7. Cc loi quy (types of recursion)
12
Chng 2: Hm quy
5. Bin ton cc v cc b
#include <iostream.h>
int i =0; // Global variable
void f1()
{
int i=0; // local variable for f1
i = 50;
}
void main()
{
int i ; // local variable for main
f1() ;
i =0;
cout<<"value of i in main "<< i<<endl;
f1();
cout<<"value of i after call "<< i<<endl;
}
Kt qu???
13
NI DUNG
1. Hm (function)
2. Khi nim ngn xp (stack)
3. Qu trnh thc thi hm
4. Tham s hm
5. Bin ton cc (global) v cc b (local)
6. quy (recursion)
7. Cc loi quy (types of recursion)
14
Chng 2: Hm quy
6. quy (Recursion)
L mt phng php lp trnh cho php mt hm c
th gi li chnh n trc tip hoc gin tip.
V d: void Test()
{
Test();
}
Mt chng trnh quy hoc mt nh ngha quy
th khng th gi n chnh n mi mi m phi c
mt im dng n mt trng hp c bit no ,
m ta gi l trng hp suy bin (degenerate case).
V d: Ta nh ngha n! nh sau:

15

1 0!
1)! - (n * n
! n
Chng 2: Hm quy

Phng php thit k mt gii thut quy:
Tham s ho bi ton
Phn tch trng hp chung : a bi ton di dng
bi ton cng loi nhng c phm vi gii quyt nh hn
theo nghi dn dn s tin n trng hp suy bin
Tm trng hp suy bin
16
6. quy (Recursion)
Chng 2: Hm quy
6. quy (Recursion)

Chng trnh quy gm hai phn chnh:
1. Phn c s: iu kin thot khi quy (im dng)
2. Phn quy: Trong phn thn chng trnh c li gi
n chnh bn thn chng trnh vi gi tr mi ca
tham s nh hn gi tr ban u
17
Chng 2: Hm quy
V d 1 : Lp hm tnh n! bng quy



int GT(int n)
{
if (n==0) // im dng
return 1;
else
return n*GT(n-1);
}
18
6. quy (Recursion)

1 0!
1)! - (n * n
! n
Chng 2: Hm quy
19
6. quy (Recursion)
Gi hm answer <- GT(5)
CT chnh: Cha xong: answer <- GT(5)
Minh ha
Chng 2: Hm quy
20
6. quy (Recursion)
CT chnh: Cha xong: answer <- GT(5)
GT. 1st: N=5, Cha xong: 5*GT(4)
Minh ha
Chng 2: Hm quy
21
6. quy (Recursion)
CT chnh: Cha xong: answer <- GT(5)
GT. 1st: N=5, Cha xong: 5*GT(4)
GT. 2nd: N=4, Cha xong: 4*GT(3)
Minh ha
Chng 2: Hm quy
22
6. quy (Recursion)
CT chnh: Cha xong: answer <- GT(5)
GT. 1st: N=5, Cha xong: 5*GT(4)
GT. 2nd: N=4, Cha xong: 4*GT(3)
GT. 3rd: N=3, Cha xong: 3*GT(2)
Minh ha
Chng 2: Hm quy
23
6. quy (Recursion)
CT chnh: Cha xong: answer <- GT(5)
GT. 1st: N=5, Cha xong: 5*GT(4)
GT. 2nd: N=4, Cha xong: 4*GT(3)
GT. 3rd: N=3, Cha xong: 3*GT(2)
GT. 4th: N=2, Cha xong: 2*GT(1)
Minh ha
Chng 2: Hm quy
24
6. quy (Recursion)
CT chnh: Cha xong: answer <- GT (5)
GT. 1st: N=5, Cha xong: 5*GT(4)
GT. 2nd: N=4, Cha xong: 4*GT(3)
GT. 3rd: N=3, Cha xong: 3*GT(2)
GT. 4th: N=2, Cha xong: 2*GT(1)
GT. 5th: N=1, Cha xong: 1*GT(0)
Minh ha
Chng 2: Hm quy
25
6. quy (Recursion)
CT chnh: Cha xong: answer <- GT(5)
GT. 1st: N=5, Cha xong: 5*GT(4)
GT. 2nd: N=4, Cha xong: 4*GT(3)
GT. 3rd: N=3, Cha xong: 3*GT(2)
GT. 4th: N=2, Cha xong: 2*GT(1)
GT. 5th: N=1, Cha xong: 1*GT(0)
GT. 6th: N=0, xong: returns 1
Minh ha
Chng 2: Hm quy
26
6. quy (Recursion)
CT chnh: Cha xong: answer <- GT(5)
GT. 1st: N=5, Cha xong: 5*GT(4)
GT. 2nd: N=4, Cha xong: 4*GT(3)
GT. 3rd: N=3, Cha xong: 3*GT(2)
GT. 4th: N=2, Cha xong: 2*GT(1)
GT. 5th: N=1, xong: returns 1*1
Minh ha
Chng 2: Hm quy
27
6. quy (Recursion)
CT chnh: Cha xong: answer <- GT(5)
GT. 1st: N=5, Cha xong: 5*GT(4)
GT. 2nd: N=4, Cha xong: 4*GT(3)
GT. 3rd: N=3, Cha xong: 3*GT(2)
GT. 4th: N=2, xong: returns 2*1
Minh ha
Chng 2: Hm quy
28
6. quy (Recursion)
CT chnh: Cha xong: answer <- GT(5)
GT. 1st: N=5, Cha xong: 5*GT(4)
GT. 2nd: N=4, Cha xong: 4*GT(3)
GT. 3rd: N=3, xong: returns 3*2
Minh ha
Chng 2: Hm quy
29
6. quy (Recursion)
CT chnh: Cha xong: answer <- GT(5)
GT. 1st: N=5, Cha xong: 5*GT(4)
GT. 2nd: N=4, xong: returns 4*6
Minh ha
Chng 2: Hm quy
30
6. quy (Recursion)
CT chnh: Cha xong: answer <- GT(5)
GT. 1st: N=5, xong: returns 5*24
Minh ha
Chng 2: Hm quy
31
6. quy (Recursion)
CT chnh: xong: answer <- 120
Minh ha
Chng 2: Hm quy
V d 2: Tnh bng quy
Dy s Fibonaci: F
1
= F
2
= 1;
F
n
= F
n-1
+ F
n-2
. (n 3)

int Fibo(int n)
{
if (n 2) // im dng
return 1;
else
return Fibo(n-1)+Fibo(n-2);
}
32
6. quy (Recursion)
Chng 3: Hm quy
Nhn xt:
Thng thng thay v s dng li gii quy cho mt
bi ton, ta c th thay th bng li gii khng quy
(kh quy) bng phng php lp.
Vic s dng gii thut quy c:





Chnh v vy, trong lp trnh ngi ta c trnh s dng
th tc quy nu thy khng cn thit.
u im Khuyt im
Thun li cho vic biu din
bi ton
Gn (i vi chng trnh)
C khi khng c ti u v
thi gian
C th gy tn b nh
33
6. quy (Recursion)
Chng 2: Hm quy
6. quy (Recursion)
Tnh giai tha dng vng lp:
34
int GT(int n)
{
int s = 1;
for(int i= 2; i<= n; i++)
s = s* i;

return s;
}
NI DUNG
1. Hm (function)
2. Khi nim ngn xp (stack)
3. Qu trnh thc thi hm
4. Tham s hm
5. Bin ton cc (global) v cc b (local)
6. quy (recursion)
7. Cc loi quy (types of recursion)
35
Chng 2: Hm quy
7. Cc loi quy
quy tuyn tnh (Linear Recursion)
quy ui (Tail Recursion)
quy nh phn (Binary Recursion)
quy m (Exponential Recursion)
quy lng (Nested Recursion)
quy h tng (Mutual Recursion)
36
Chng 2: Hm quy
7. Cc loi quy
quy tuyn tnh (Linear Recursion)
mi ln hm thc thi ch gi quy 1 ln
(only makes a single call to itself each time the function
runs)
37
int GT(int n)
{
if (n==0) // im dng
return 1;
else
return n*GT(n-1);
}
V d: tnh giai tha bng quy:
Chng 2: Hm quy
7. Cc loi quy
quy ui (Tail Recursion)
l mt dng quy tuyn tnh
lnh cui cng ca hm l mt li gi quy (the last
operation of the function is a recursive call)
d chuyn thnh vng lp

38
int gcd(int m, int n)
{
int r;
if (m < n) return gcd(n,m);
r = m%n;
if (r == 0) return n;
else return gcd(n,r);
}
V d: tm c s chung ln nht ca m, n bng quy
(Greatest Common Denominator)
Chng 2: Hm quy
7. Cc loi quy
quy nh phn (Binary Recursion)
mi ln hm thc thi c th gi quy 2 ln
(A recursive function which calls itself twice during the
course of its execution)


39
int choose(int n, int k)
{
if (k == 0 || k == n)
return 1;
else
return (choose(n-1, k) + choose(n-1, k-1));
}
V d: tnh s cc t hp chp k ca n phn t (C(n,k))
bng quy:
1 nu k = 0 or k=n
C(n, k) =
C(n-1, k) + C(n-1, k-1) nu 0 < k < n
Chng 2: Hm quy
7. Cc loi quy
quy m (Exponential Recursion)
l loi quy m s li gi quy c tnh bng hm
m (if you were to draw out a representation of all the
function calls, would have an exponential number of calls
in relation to the size of the data set)
40
V d: vit hm xut ra cc hon v ca cc s trong mng
void print_permutations (int arr[], int n, int i)
{
int j, swap;
print_array (arr, n);
for (j=i+1; j<n; j++)
{
swap = arr[i]; arr[i] = arr[j]; arr[j] = swap;
print_permutations(arr, n, i+1);
swap = arr[i]; arr[i] = arr[j]; arr[j] = swap;
}
}
void print_array (int arr[], int n)
{
int i;
for(i=0; i<n; i++) cout<<arr[i];
cout<<"\n";
}
Chng 2: Hm quy
7. Cc loi quy
quy lng (Nested Recursion)
trong quy lng, tham s trong li gi quy l mt li
gi quy (In nested recursion, one of the arguments to
the recursive function is the recursive function itself)
quy lng pht trin rt nhanh

41
V d: vit hm Ackermann's:
int ackerman (int m, int n)
{
if (m == 0) return (n+1);
else if (n == 0)
return ackerman(m-1,1);
else
return ackerman(m-1, ackerman(m,n-1));
}
Chng 2: Hm quy
7. Cc loi quy
quy lng (Nested Recursion)
42
Chng 2: Hm quy
7. Cc loi quy
quy h tng (Mutual Recursion)
hm quy khng cn thit phi gi chnh n (A
recursive function doesn't necessarily need to call itself)
mt s hm quy gi ln nhau
v d: hm A gi hm B, hm B gi hm C, hm C li gi
hm A
43
int is_even(unsigned int n)
{
if (n==0) return 1;
else return (is_odd(n-1));
}
int is_odd(unsigned int n)
{
return (!is_even(n));
}
V d: vit hm kim tra chn, l bng quy:
Chng 2: Hm quy
Gii mt s bi tp quy
V d 1: Bi ton thp H Ni
Chuyn mt chng a gm n a vi kch thc khc
nhau t ct A sang ct C theo cch:



44
+ Mi ln ch chuyn 1 a
+ Khng c trng hp a ln
c t trn a nh
+ Khi chuyn c th dng ct trung
gian B
Chng 2: Hm quy
Gii mt s bi tp quy
V d 1: Bi ton thp H Ni

Tham s ho bi ton: HaNoi (n, A, B, C)
Trong : n: S a.
A: Cc ngun cn chuyn a i
B: Cc trung gian
C: Cc ch chuyn a n
(A, B, C c kiu k t)

45
Chng 2: Hm quy
Gii thut quy bi ton Thp H Ni:
Trng hp suy bin (im dng):
Nu n = 1 th chuyn a t A qua C
Trng hp chung (n 2):
Th vi n=2: + Chuyn a th nht t A sang B
+ Chuyn a th hai t A sang C
+ Chuyn a th nht t B sang C
Tng qut:
+ Chuyn (n -1) a t A sang B (C lm trung gian)
+ Chuyn 1 a t A sang C (B lm trung gian)
+ Chuyn (n -1) a t B sang C (A lm trung gian)
46
Gii mt s bi tp quy
Chng 2: Hm quy
Gii mt s bi tp quy
A
B C
1 a
Chng 2: Hm quy
Gii mt s bi tp quy
A
B C
1 a
Chng 2: Hm quy
Gii mt s bi tp quy
A
B C
2 a
Chng 2: Hm quy
Gii mt s bi tp quy
A
B C
2 a
Chng 2: Hm quy
Gii mt s bi tp quy
A
B C
2 a
Chng 2: Hm quy
Gii mt s bi tp quy
A
B C
2 a
Chng 2: Hm quy
Gii mt s bi tp quy

A
B C
N a
Chng 2: Hm quy
Gii mt s bi tp quy

A
B C
N a
Chng 2: Hm quy
Gii mt s bi tp quy

A
B C
N a
Chng 2: Hm quy
Gii thut quy bi ton Thp H Ni:


56
Gii mt s bi tp quy
void HaNoi (int n, char A, char B, char C){
if (n==1)
cout<<A<<<< C;
else{
HaNoi(n -1, A, C, B);
HaNoi(1, A, B, C);
HaNoi(n -1, B, A, C);
}
}
Chng 2: Hm quy
Gii mt s bi tp quy
Bi tp: Vit hm quy cho php in chui o ngc
- Trng hp chung: + In k t cui ca chui X
+ Ly phn chui cn li
- Trng hp suy bin: Nu chui rng th khng lm g
57
void InNguoc(char *X)
{
static int len=strlen(X);
if (len>0) {
cout<<X[len-1];
len--;
InNguoc(X);
}
}
Chng 2: Hm quy
Gii mt s bi tp quy
Bi tp: Vit hm quy cho php xut biu din nh
phn ca 1 s nguyn n, v d: n=13 1101
58
Xut dng nh phn ca n:
Nu (n/2>0) Xut dng nh phn ca n/2;
Xut (n%2);
void XuatNhiPhan(int n)
{
if (n/2>0)
XuatNhiPhan (n/2);
cout<<n%2;
}
Chng 2: Hm quy
Gii mt s bi tp quy
Bi tp: Vit hm quy cho php nhp s giy v chuyn
thnh gi, pht, giy. V d: nhp 3665 -> 1 gi 1 pht 5 giy

59
void DoiGio(int n, int &g, int &p, int &gi)
{
if (n<60)
gi=n;
else if (n/3600>0) {
g=n/3600;
return DoiGio(n%3600, g, p, gi);
}
else{
p=n/60;
return DoiGio(n%60, g, p, gi);
}
}
Chng 2: Hm quy
Gii mt s bi tp quy
Bi tp: Vit hm quy cho php kim tra xem mt
s c phi s nguyn t khng

60
int isPrime (int N)
{
if (N==1) return 1;
int static M=N-1;
if (M==1) return 1;
else if (N%M==0) return 0;
else {
M--;
isPrime (N);
}
}
isPrime(N) = prime(N, N-1)
prime(N, 1) = true
prime(N, D) = if D divides N, false
else prime(N, D-1)
Chng 2: Hm quy
Gii mt s bi tp quy
Bi tp: Vit hm quy cho php tnh tng cc ch
s ca mt s nguyn n, v d n=1980
=>Sum=1+9+8+0=18

61
int tong(int n)
{
if (n<10)
return n;
else
return n%10+tong(n/10);
}
Tng cc ch s ca n:
+ Nu (n<10) th Tng bng n;
+ Nu (n<10) th Tng bng n%10 + Tng cc ch s ca n/10
Chng 2: Hm quy
Gii mt s bi tp quy
Bi tp: Vit hm quy cho php xut ngc mt s
nguyn n, v d n=1980 xut 0891
62
Xut ngc n:
+ Nu n<10 th Xut n
+ Nu n>=10 th Xut n%10 v Xut ngc n/10
void XuatSoNguoc(int n)
{
if (n<10)
cout<<n;
else {
cout<<n%10;
XuatSoNguoc(n/10);
}
}
Chng 2: Hm quy
Gii mt s bi tp quy
Bi tp: In hnh tam gic sau bng cch quy
63
void InSao(int n)
{
if (n>1)
InSao(n-1);
for (int i=0; i<n; i++)
cout<<"*";
cout<<endl;
}
Chng 2: Hm quy
Gii mt s bi tp quy
Bi tp: Cho mng a c n phn t, tnh tng cc phn
t trong mng bng quy






64
iu kin bin: Mng 0 phn t th tng bng 0
Gii thut chung:
Sum (a,n) = 0 , n=0
a[n-1] + Sum(a, n-1), n>0
Chng 2: Hm quy
Gii mt s bi tp quy
Bi tp: Cho mng a c n phn t, tm gi tr ln nht
trong mng bng quy







65
iu kin bin: Mng 1 phn t th tr ln nht l a[0]
Gii thut chung:
Max (a,n) = a[0] , n=1
a[n-1] > Max(a, n-1)? a[n-1] : Max(a,n-1), n>1

Вам также может понравиться