Professional Documents
Culture Documents
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
? 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; }
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
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)
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!
= = = = = = = = = =
20 } /* end main */ 21
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
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 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
14
15
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 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
20
21
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
(Trial-and-Error)
23
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
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