You are on page 1of 65

Chng 2:

HM - QUY
(Function - Recursion)

NI DUNG
1.
2.
3.
4.
5.
6.
7.

Hm (function)
Khi nim ngn xp (stack)
Qu trnh thc thi hm
Tham s hm
Bin ton cc (global) v cc b (local)
quy (recursion)
Cc loi quy (types of recursion)
2

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;
}

NI DUNG
1.
2.
3.
4.
5.
6.
7.

Hm (function)
Khi nim ngn xp (stack)
Qu trnh thc thi hm
Tham s hm
Bin ton cc (global) v cc b (local)
quy (recursion)
Cc loi quy (types of recursion)
4

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

NI DUNG
1.
2.
3.
4.
5.
6.
7.

Hm (function)
Khi nim ngn xp (stack)
Qu trnh thc thi hm
Tham s hm
Bin ton cc (global) v cc b (local)
quy (recursion)
Cc loi quy (types of recursion)
6

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

3. Qu trnh thc thi hm


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

Kt qu???

NI DUNG
1.
2.
3.
4.
5.
6.
7.

Hm (function)
Khi nim ngn xp (stack)
Qu trnh thc thi hm
Tham s hm
Bin ton cc (global) v cc b (local)
quy (recursion)
Cc loi quy (types of recursion)
9

4. Tham s hm
Tham s hm l tham tr (value):

1.

gi tr tham s truyn trc v sau khi gi hm l


nh nhau

Tham s hm l tham chiu (reference):

2.

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 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 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.
2.
3.
4.
5.
6.
7.

Hm (function)
Khi nim ngn xp (stack)
Qu trnh thc thi hm
Tham s hm
Bin ton cc (global) v cc b (local)
quy (recursion)
Cc loi quy (types of recursion)
12

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.
2.
3.
4.
5.
6.
7.

Hm (function)
Khi nim ngn xp (stack)
Qu trnh thc thi hm
Tham s hm
Bin ton cc (global) v cc b (local)
quy (recursion)
Cc loi quy (types of recursion)
14

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

n * (n - 1)!
n!
0! 1

d: Ta nh ngha n! nh sau:

15

6. quy (Recursion)
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

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

6. quy (Recursion)

V d 1 : Lp hm tnh n! bng quy

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

6. quy (Recursion)
Minh ha

Gi hm answer <- GT(5)

CT chnh:

Cha xong: answer <- GT(5)


19

6. quy (Recursion)
Minh ha

GT. 1st: N=5,


CT chnh:

Cha xong: 5*GT(4)

Cha xong: answer <- GT(5)


20

6. quy (Recursion)
Minh ha

GT. 2nd: N=4,

Cha xong: 4*GT(3)

GT. 1st: N=5,

Cha xong: 5*GT(4)

CT chnh:

Cha xong: answer <- GT(5)


21

6. quy (Recursion)
Minh ha

GT. 3rd: N=3,

Cha xong: 3*GT(2)

GT. 2nd: N=4,

Cha xong: 4*GT(3)

GT. 1st: N=5,

Cha xong: 5*GT(4)

CT chnh:

Cha xong: answer <- GT(5)


22

6. quy (Recursion)
Minh ha

GT. 4th: N=2,

Cha xong: 2*GT(1)

GT. 3rd: N=3,

Cha xong: 3*GT(2)

GT. 2nd: N=4,

Cha xong: 4*GT(3)

GT. 1st: N=5,

Cha xong: 5*GT(4)

CT chnh:

Cha xong: answer <- GT(5)


23

6. quy (Recursion)
Minh ha

GT. 5th: N=1,

Cha xong: 1*GT(0)

GT. 4th: N=2,

Cha xong: 2*GT(1)

GT. 3rd: N=3,

Cha xong: 3*GT(2)

GT. 2nd: N=4,

Cha xong: 4*GT(3)

GT. 1st: N=5,

Cha xong: 5*GT(4)

CT chnh:

Cha xong: answer <- GT (5)


24

6. quy (Recursion)
Minh ha

GT. 6th: N=0,

xong: returns 1

GT. 5th: N=1,

Cha xong: 1*GT(0)

GT. 4th: N=2,

Cha xong: 2*GT(1)

GT. 3rd: N=3,

Cha xong: 3*GT(2)

GT. 2nd: N=4,

Cha xong: 4*GT(3)

GT. 1st: N=5,

Cha xong: 5*GT(4)

CT chnh:

Cha xong: answer <- GT(5)


25

6. quy (Recursion)
Minh ha

GT. 5th: N=1,

xong: returns 1*1

GT. 4th: N=2,

Cha xong: 2*GT(1)

GT. 3rd: N=3,

Cha xong: 3*GT(2)

GT. 2nd: N=4,

Cha xong: 4*GT(3)

GT. 1st: N=5,

Cha xong: 5*GT(4)

CT chnh:

Cha xong: answer <- GT(5)


26

6. quy (Recursion)
Minh ha

GT. 4th: N=2,

xong: returns 2*1

GT. 3rd: N=3,

Cha xong: 3*GT(2)

GT. 2nd: N=4,

Cha xong: 4*GT(3)

GT. 1st: N=5,

Cha xong: 5*GT(4)

CT chnh:

Cha xong: answer <- GT(5)


27

6. quy (Recursion)
Minh ha

GT. 3rd: N=3,

xong: returns 3*2

GT. 2nd: N=4,

Cha xong: 4*GT(3)

GT. 1st: N=5,

Cha xong: 5*GT(4)

CT chnh:

Cha xong: answer <- GT(5)


28

6. quy (Recursion)
Minh ha

GT. 2nd: N=4,

xong: returns 4*6

GT. 1st: N=5,

Cha xong: 5*GT(4)

CT chnh:

Cha xong: answer <- GT(5)


29

6. quy (Recursion)
Minh ha

GT. 1st: N=5,


CT chnh:

xong: returns 5*24

Cha xong: answer <- GT(5)


30

6. quy (Recursion)
Minh ha

CT chnh:

xong: answer <- 120


31

6. quy (Recursion)
V d 2: Tnh bng quy
Dy s Fibonaci: F1 = F2 = 1;

Fn = Fn-1 + Fn-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)

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:

u im
Thun

li cho vic biu din

bi ton
Gn (i vi chng trnh)

Khuyt im
C

khi khng c ti u v
thi gian
C th gy tn b nh

Chnh v vy, trong lp trnh ngi ta c trnh s dng th


tc quy nu thy khng cn thit.
33

6. quy (Recursion)
Tnh

giai tha dng vng lp:


int GT(int n)
{
int s = 1;
for(int i= 2; i<= n; i++)
s = s* i;
return s;
}

34

NI DUNG
1.
2.
3.
4.
5.
6.
7.

Hm (function)
Khi nim ngn xp (stack)
Qu trnh thc thi hm
Tham s hm
Bin ton cc (global) v cc b (local)
quy (recursion)
Cc loi quy (types of recursion)
35

7. Cc loi quy





quy
quy
quy
quy
quy
quy

tuyn tnh (Linear Recursion)


ui (Tail Recursion)
nh phn (Binary Recursion)
m (Exponential Recursion)
lng (Nested Recursion)
h tng (Mutual Recursion)

36

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)
V d: tnh giai tha bng quy:

int GT(int n)
{
if (n==0)
// im dng
return 1;
else
return n*GT(n-1);
}
37

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
V d: tm c s chung ln nht ca m, n bng quy
(Greatest Common Denominator)
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);
}

38

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

int choose(int n, int k)


{
if (k == 0 || k == n)
return 1;
else
return (choose(n-1, k) + choose(n-1, k-1));
}

39

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)
V d: vit hm xut ra cc hon v ca cc s trong mng
void print_array (int arr[], int n)
{
int i;
for(i=0; i<n; i++) cout<<arr[i];
cout<<"\n";
}

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;
}
}
40

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
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));
}

41

7. Cc loi quy

quy lng (Nested Recursion)

42

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
V li
d: gi
vit hm
hm kim
tra chn, l bng quy:
A
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));
}

43

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:
+ 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

44

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

Gii mt s bi tp 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
1 a

Gii mt s bi tp quy
1 a

Gii mt s bi tp quy
2 a

Gii mt s bi tp quy
2 a

Gii mt s bi tp quy
2 a

Gii mt s bi tp quy
2 a

Gii mt s bi tp quy
N a

Gii mt s bi tp quy
N a

Gii mt s bi tp quy
N a

Gii mt s bi tp quy
Gii thut quy bi ton Thp H Ni:
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);
}
}

56

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
void InNguoc(char *X)
g
{

static int len=strlen(X);


if (len>0) {
cout<<X[len-1];
len--;
InNguoc(X);
}
}
57

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
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;
}
58

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
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);
}
}

59

Gii mt s bi tp quy
Bi

tp: Vit hm quy cho php kim tra


xem mt s c phi s nguyn t khng

isPrime(N) = prime(N, N-1)


prime(N, 1) = true
prime(N, D) = if D divides N, false
else prime(N, D-1)

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);
}
}
60

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

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

int tong(int n)
{
if (n<10)
return n;
else
return n%10+tong(n/10);
}

61

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
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);
}
}

62

Gii mt s bi tp quy
Bi

tp: In hnh tam gic sau bng cch quy


void InSao(int n)
{
if (n>1)
InSao(n-1);
for (int i=0; i<n; i++)
cout<<"*";
cout<<endl;
}

63

Gii mt s bi tp quy
Bi

tp: Cho mng a c n phn t, tnh tng cc


phn t trong mng bng quy

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

64

Gii mt s bi tp quy
Bi

tp: Cho mng a c n phn t, tm gi tr ln


nht trong mng bng quy

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

65

You might also like