You are on page 1of 8

K THUT LP TRNH

KHI NIM QUY


?

K THUT PHT TRIN CHNG TRNH


NI DUNG

Sc mnh ca quy l g? Li gii ca bi ton T gi l quy nu n c thc hin bng li gii ca bi ton T c dng ging T Gii thut tng ng vi li gii quy gi l gii thut quy. Biu din gii thut quy: trong chng trnh cn c th tc hay chng trnh con.
quy trc tip: trong th tc P c cha li gi n chnh n quy gin tip: trong th tc P c li gi th tc Q v trong Q c li gi n P. Cn xc nh tnh hung, iu kin kt thc quy.

Hm v Th tc Pht trin chng trnh bng phng php tinh chnh dn tng bc. nh ngha v s dng hm trong ngn ng C Hm quy

V d 1. Hm tnh giai tha


5! = 5 * 4 * 3 * 2 * 1 Ch rng:
5! = 5 * 4! 4! = 4 * 3! ...

? Bi ton no c th dng quy? Hm quy thng c vit theo thut ton sau:
if (trng hp suy bin) { Li gii bi ton trong trng hp suy bin; } else { Gi quy ti hm vi gi tr khc ca tham s; }

C th thc hin gi qui iu kin kt thc gi qui: 1! = 0! = 1


2! = 2 * 1! = 2 * 1 = 2; 3! = 3 * 2! = 3 * 2 = 6;
2

V D V CHNG TRNH QUY

V d 1. Hm giai tha
1, if n = 0 Fac ( n) = if n > 0 n * Fac ( n 1),
function Fac(i: integer): integer; begin
if i <=1 then Fac := 1 else Fac:= i * Fac(i 1);
2 * 1! 1 (a) S e q u en c e o f re c ursive c a lls. 5! 5 * 4! 4 * 3! 3 * 2! 5!

Fin a l va lue = 120 5! = 5 * 24 = 120 is re turn ed 5 * 4! 4! = 4 * 6 = 24 is re turne d 4 * 3! 3! = 3 * 2 = 6 is re tu rn e d 3 * 2! 2! = 2 * 1 = 2 is re turne d 2 * 1! 1 re turne d 1 ( b ) Va lue s re turne d fro m e a c h re cu rsive c a ll.

end;

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

/* Fig. 5.14: fig05_14.c Recursive factorial function */ #include <stdio.h>

22 /* recursive definition of function factorial */ 23 long factorial( long number ) 24 { 25 26 27 28 29 30 31 32 /* base case */ if ( number <= 1 ) { return 1; } /* end if */ else { /* recursive step */ return ( number * factorial( number - 1 ) ); } /* end else */

long factorial( long number ); /* function prototype */ /* function main begins program execution */ int main() { int i; /* counter */ /* loop 10 times. During each iteration, calculate

fig05_14.c (Part 1 of 2)

33 } /* end function factorial */

factorial( i ) and display result */ for ( i = 1; i <= 10; i++ ) { printf( "%2d! = %ld\n", i, factorial( i ) ); } /* end for */ return 0; /* indicates successful termination */

1! 2! 3! 4! 5! 6! 7! 8! 9! 10!

= = = = = = = = = =

1 2 6 24 120 720 5040 40320 362880 3628800

20 } /* end main */ 21

V D V CHNG TRNH QUY


V D V CHNG TRNH QUY


1, if n < 2 Fib( n ) = Fib( n 1) + Fib( n 2),

V d 2. Dy s Fibonacci Bi ton:
Cc con th khng bao gi cht. Hai thng sau khi ra i mt cp th mi s sinh ra mt cp th con (1 c, 1 ci). Khi sinh con ri th c mi thng tip theo chng li sinh c mt cp mi. Gi s bt u t mt cp mi ra i th n thng th n s c bao nhiu cp?

if n 2

function Fib(n: integer):integer;


begin if n = 0 then Fib := 0 else if n = 1 then Fib := 1 else Fib := Fib(n1) + Fib(n2); end;

1 2 3 4 5 6 7 8 9 10 11 12 13

/* Fig. 5.15: fig05_15.c Recursive fibonacci function */ #include <stdio.h> long fibonacci( long n ); /* function prototype */ /* function main begins program execution */ int main() { long result; /* fibonacci value */ long number; /* number input by user */ /* obtain integer from user */ printf( "Enter an integer: " ); scanf( "%ld", &number ); /* calculate fibonacci value for number input by user */ result = fibonacci( number ); /* display result */ printf( "Fibonacci( %ld ) = %ld\n", number, result ); return 0; /* indicates successful termination */

Gi function fibonacci
f( 3 )

return

f( 2 )

f( 1 )

14 15 16 17 18 19 20 21 22

return

f( 1 )

f( 0 )

return 1

return 1

return 0

23 24

25 } /* end main */ 26

10

27 /* Recursive definition of function fibonacci */ 28 long fibonacci( long n ) 29 { 30 31 32 33 34 35 36 37 38 } /* end function fibonacci */ /* base case */ if ( n == 0 || n == 1 ) { return n; } /* end if */ else { /* recursive step */ return fibonacci( n - 1 ) + fibonacci( n - 2 ); } /* end else */

Program Output

V D V CHNG TRNH QUY

V d 3. ng Hilbert
ng Hilbert cp 0 l hnh rng. ng Hilbert cp i + 1 c thnh lp t 4 ng cp i c quay theo 1 gc thch hp v ni vi nhau bi 3 on thng.

Enter an integer: 0 Fibonacci( 0 ) = 0 Enter an integer: 1 Fibonacci( 1 ) = 1 Enter an integer: 2 Fibonacci( 2 ) = 1 Enter an integer: 3 Fibonacci( 3 ) = 2 Enter an integer: 4 Fibonacci( 4 ) = 3

13

V D V CHNG TRNH QUY

V D V CHNG TRNH QUY

x, y - bin to ; h - di ca on ni; plot - v t v tr hin ti xc nh bi x, y procedure A(i:integer);


begin if i > 0 then begin B(i1); x := x h; plot; A(i1); y := y h; plot; A(i1); x := x + h; plot; D(i1); end;

14

15

V D V CHNG TRNH QUY


V D V CHNG TRNH QUY

procedure B(i:integer); procedure C(i:integer); procedure D(i:integer); Chng trnh chnh


Begin read(n, x, y, h); D(n); end.

16

17

BI TON THP H NI

BI TON THP H NI

V d 4. C n a, kch thc khc nhau, c l gia v ba ct k hiu l A, B, C. a c th xp chng ln nhau, xuyn qua mt ct to thnh hnh thp. Gi s ban u n a c t ct A theo th t ln di nh trn. Cn di cc a n ct C nhng vn phi gi th t c, vi cc rng buc sau:
Mi ln ch chuyn mt a t ct ny sang ct khc a ln khng c chng ln a nh c php dng ct B lm trung gian

Trng hp 1 a: Chuyn a t ct A sang ct C Trng hp 2 a:


Chuyn a th nht (tnh t a trn cng, hay a nh nht) t ct A sang ct B Chuyn a th 2 t ct A sang ct C Chuyn a th nht t ct B sang ct C.

Trng hp n a (n >2)
Chuyn (n1) a t ct A sang ct B Chuyn a th n t ct A sang ct C Chuyn (n 1) a t ct B sang ct C

18

19

BI TON THP H NI

BI TON THP H NI

Procedure HanoiTower(n, A, B, C: byte)


Begin 1. if n = 1 then Chuyn a t A sang C 2. else begin Call HanoiTower(n1, A, C, B); Call HanoiTower(1, A, B, C); Call HanoiTower(n 1, B, A, C); end;

Cc thut ton Chia tr (DivideandConquer)


gii bi ton B vi b d liu S, ta chia s thnh cc b d liu con S1, S2, , Sk m vi b d liu ny, bi ton B gii c bng mt thut ton n gin. Sau t hp li gii ca cc bi ton trn b d liu Si s cho li gii ca bi ton B vi b d liu S. Thng s dng li gi quy

20

21

THUT TON QUAY LUI


KHI NO KHNG S DNG QUY?

Thut ng: Backtracking [D.H. Lehmer, 1950] Ci tin t thut ton tm kim th Tm kim c h thng, theo chiu su, trn tp cc phng n c th. Th v sai Cc v d:
Bi ton Qun Hu Bi ton M i tun Bi ton Hn nhn bn vng
22

Thut ton quy


function Fac(i: integer): integer; {lu nn dng s nguyn ln} begin if i <=1 then Fac := 1 else Fac:= i * Fac(i 1); end;

(Trial-and-Error)

Thng s dng quy

23

KHI NO KHNG S DNG QUY?

Thut ton khng quy (S dng vng lp)


function Fac2(i: integer):integer; begin i := 0; F := 1; while i < n do begin i := i +1; F := F * i; end; end;
24

qui v lp:

Lp
Lp: r rng, kim sot trong qu trnh chy chng trnh qui: lp li li gi hm

Kt thc
Lp: iu kin lp sai (false) qui: nhn ra tnh hung, iu kin kt thc qui

C hai u c th lp v hn Cn nhc
Chn gia lp v gi qui?
25

KHI NO KHNG S DNG QUY?


BI TP
1. Xy dng cc hm s sau bng phng php quy: f(x,n) = xn , (n >=0) s(n) = (2n)! 2. Vit chng trnh s dng hm quy tnh UCLN ca hai s nguyn dng theo quy tc sau: Nu x= y th UCLN(x, y) = x Nu x > y th UCLN(x, y) = UCLN(x y, y); Nu x < y th UCLN(x, y) = UCLN(x, y x);

quy l tt nht? Khi no nn dng quy Nhng m hnh bi ton nn trnh dng quy: P if B then S; P end; hay P S; if B then P end;

26

27

BI TP
3. Vit chng trnh s dng hm quy v ng Hilber cp k (k nhp vo t bn phm) 4. Vit chng trnh s dng quy gii bi ton Thp H Ni

28

You might also like