You are on page 1of 22

Chng II: K thut quy

Thut ton quy


2. nh gi phc tp ca cc thut ton
quy
3. Mt s bi ton s dng thut ton quay
lui
* Lm bi tp theo nhm
1.

1. Thut ton quy (Recursion)


i

cng
Phng php thit k mt thut ton
quy
Xy dng mt thut ton quy trn
mng
Xy dng mt thut ton quy trn danh
sch lin kt n
Xy dng mt thut ton quy trn cy
nh phn (lu tr mc ni)

i cng
Chng

trnh quy l chng trnh gi


n chnh n.
Mt chng trnh quy th khng th gi
n chnh n mi mi m phi c im
dng (trng hp suy bin).

Phng php thit k mt


thut ton quy
Tham

s ho bi ton
Phn tch trng hp chung (biu din bi
ton di dng bi ton cng loi nhng
khc phm vi gii quyt)
Xc nh trng hp suy bin

V d: Tnh an
Tham

s ho bi ton:
Function Power(a: real; n: byte):real;
Phn tch trng hp chung:
an = a.an-1 hay Power(a,n) = a* Power(a,n-1)
Tr.hp suy bin: n = 0 ( Power(a,0) = 1 )
phc tp tnh ton: O(n)

V d: Tnh an (mt cch tnh khc)


Phn

tch trng hp chung:

Nu n chn: Power(a,n) = sqr(Power(a,n div 2))


Nu n l: Power(a,n) = a*sqr(Power(a,n-1 div 2))
Trng

hp suy bin: n = 0 (Power(a,0) = 1)


phc tp tnh ton: O(log2n)

Xy dng mt thut ton quy


trn mng
Xt

khai bo cho trc nh sau:


Type Mang = array[1..Max] of Integer;
Var a: Mang;
Yu cu thut ton (hm/th tc): X l trn dy
s gm n phn t: a[1], a[2], ... a[n].
Tham s ha chng trnh con CTC:
Cch 1: CTC([var] n: word; ...) {x l t phn t

a[1] n a[n]}
Cch 2: CTC([var] dau, cuoi: word; ...) {x l t
phn t u l a[dau] n phn t cui l a[cuoi]}

V d: Sp xp mng a gm n phn t
Tham

s ho bi ton (cch 1):


procedure Sort(n: word);
Phn tch trng hp chung:
Th tc Sort(n) c biu din bi cc lnh:
Sort(n-1);
if a[n-1]>a[n] then
begin swap(a[n-1],a[n]);
Sort(n-1);
end;
Xc

nh trng hp suy bin: n <= 1 (khng


lm g)

procedure Sort(n: word);


Begin
If n>1 then
begin

Sort(n-1);
if a[n-1]>a[n] then
begin swap(a[n-1],a[n]);
Sort(n-1);
end;

end;

End;
Li gi t chng trnh chnh: Sort(n);
phc tp tnh ton: O(n2)

V d: Sp xp mng a gm n phn t
Tham

s ho bi ton (cch 2):


procedure Sort(dau, cuoi: word);
Phn tch trng hp chung:
Th tc Sort(dau, cuoi) c biu din bi cc lnh:
Sort(dau+1, cuoi);
if a[dau]>a[dau+1] then
begin swap(a[dau],a[dau+1]);
Sort(dau+1, cuoi);
end;
Xc

nh trng hp suy bin: dau = cuoi


(khng lm g)

procedure Sort(dau, cuoi: word);


Begin
If dau<>cuoi then
begin

Sort(dau+1, cuoi);
if a[dau]>a[dau+1] then
begin swap(a[dau],a[dau+1]);
Sort(dau+1, cuoi);
end;

end;

End;
Li gi t chng trnh chnh: Sort(1,n);
phc tp tnh ton: O(n2)

Xy dng mt thut ton quy


trn mt danh sch lin kt n
Xt

khai bo cho trc nh sau:


Type TroNut = ^Nut;
Nut = Record
Info: Integer;
Next: TroNut;
End;
Var
F: TroNut; {danh sch F}

Vit chng trnh con (hm/th tc):


CTC([var] F: TroNut; ...)
Xem

th c th biu din: CTC(F, ...) bi

CTC(F^.next, ...)
V d: Lit k gi tr trng Info ca mi nt thuc
danh sch F
Procedure List(F: TroNut);
Begin
If F<>nil then
begin
writeln(F^.Info);
List(F^.Next);
end;
End;

Sp xp mt danh sch F
Procedure Sort(F: TroNut);
Begin
If (F<>nil) and (F^.Next<>nil) then
begin Sort(F^.Next);
If F^.Info>F^.Next^.Info then
begin swap(F^.Info, F^.Next^.Info);
Sort(F^.Next);
end;
end;
End;

Hm Function LaTangDan(F: TroNut): Boolean


kim tra tnh tng dn ca danh sch F
Function LaTangDan(F: TroNut): Boolean;
Begin
If (F = nil) or (F^.Next = nil) then LaTangDan:= True
else LaTangDan:= (F^.Info<= F^.Next^.Info)
and LaTangDan(F^.Next);
End;

Th tc b sung mt nt c gi tr trng
Info bng X vo danh sch tng dn F
Procedure BS(var F: TroNut; X:Integer);
var q: TroNut;
Begin If (F=nil) or (F^.Info >= X) then
begin new(q); q^.info:=X; q^.next:= F;
F:=q;
end
Else BS(F^.Next, X);
End;

Th tc xo mt nt c gi tr trng Info
bng X ca danh sch tng dn F
Procedure Xoa(var F: TroNut; X:Integer);
var q: TroNut;
Begin
If (F<>nil) and (F^.Info <= X) then
If F^.Info=X then
begin q:=F;
F:= F^.Next;
Dispose(q);
end
Else Xoa(F^.Next, X);
End;

Xy dng mt thut ton quy trn


mt cy nh phn lu tr mc ni
Xt

khai bo cho trc nh sau:


Type TroNut = ^Nut;
Nut = Record
Info: Integer;
Left, Right: TroNut;
End;
Var
T: TroNut; {cy T}

Vit chng trnh con (hm/th tc):


CTC([var] T: TroNut; ...)
Xem

th c th biu din: CTC(T, ...) bi

CTC(T^.left, ...) v CTC(T^.right, ...)


V d: Th tc xo cy T

Procedure Xoa(T: TroNut);


Begin
If T<> nil then
begin Xoa(T^.Left);
Xoa(T^.Right);
Dispose(T);
end;
End;

V d: Tm chiu cao ca cy T
Function ChieuCao(T: Tronut): Word;
Begin
If T = nil
then ChieuCao:= 0
else
ChieuCao:=max(ChieuCao(T^.left),ChieuCao(T^.Right))+1;
End;

V d: Tm a ch nt cha ca nt tr bi p
(thuc cy T)
Function Cha(T, p: TroNut):TroNut;
Begin
If (T=nil) or (T=p)
then Cha:=nil
else
If (T^.Left=p) or (T^.Right=p)
then Cha:=T
else
if Cha(T^.Left, p)<>nil
then Cha:= Cha(T^.Left, p)
else Cha:= Cha(T^.Right, p);
End;

V d: Kim tra cy T l mt ng
Function LaDong(T: TroNut): Boolean;
{cho kt qu l True nu cy T l mt ng}
Begin
If (T = nil) or (T^.Left=nil and T^.Right=nil)
then LaDong:= True
else If T^.Left=nil
then LaDong:=(T^.Info> T^.Right^.Info) and LaDong(T^.Right)
else
If T^.Right=nil
then LaDong:= (T^.Info> T^.Left^.Info)
and LaDong(T^.Left)
else LaDong:= (T^.Info> T^.Left^.Info)
and (T^.Info> T^.Right^.Info)
and LaDong(T^.Left)
and LaDong(T^.Right);
End;

You might also like