You are on page 1of 10

Ngn ng lp trnh C

Quy

Nguyn l
1. Trong C cho php trong thn mt hm c th gi ngay n chnh n, c ch ny gi l qui. 2. C th nh ngha hm qui l hm s gi n chnh n trc tip hay gin tip thng qua cc hm khc. 3. Cch tin hnh gii mt bi ton qui nhn chung c nhng im chung sau.
1. Hm qui thc ra ch bit cch gii bi ton trong trng hp n gin nht (hay cn gi l trng hp c s). 2. Nu hm c gi trong cc trng hp phc tp hn, hm qui s chia cng vic cn gii quyt thnh hai phn. Mt phn hm bit cch gii quyt nh th no, cn phn kia vn khng bit cch gii quyt nh th no tuy nhin c gi l c kh nng qui, phn sau phi ging vi bi ton ban u nhng n gin hn hay nh hn bi ton ban u. 3. m bo vic qui c kt thc, mi mt ln gi qui th bi ton phi m bo n gin hn v cc bc qui ny cn thc hin tip cho dn khi no bi ton n gin dn, n gin ti mc tr thnh trng hp c s.

Tnh giai tha


V d: Vit chng trnh nhp s t nhin n v tnh giai tha : n!. Gii quyt bi ton bng vng lp

1. #include <stdio.h>
2. unsigned long int factorial(int n) 3. { unsigned long f = 1; 4. for (int i = 1; i<=n; i++) 5. f *= i; 6. return f; 7. } 8. int main(void) 9. { int n; 10. 11. 12. } printf(Nhap n:); scanf(%d, &n); printf(n! = %d! = %l\n, n, factorial(n)); return 0;

Tnh giai tha


Tuy nhin cng c th nh ngha qui hm giai tha nh sau : nu n>0 n! = n * (n-1)! nu n=0 n! = 0! = 1

1. #include <stdio.h> 2. unsigned long int factorial(int n) 3. { if(n==0) 4. return 1; 5. return (n* factorial(n-1)); 6. } 7. int main(void) 8. { int n; 9. printf(Nhap n:); scanf(%d, &n); 10. printf(n! = %d! = %l\n, n, factorial(n)); 11. return 0; 12. }

Dy Fibonaci
Mt v d th hai dng qui l tnh dy s Fibonaci Dy s Fibonaci gm nhng s 0, 1, 1, 2, 3, 5, 8, 13, 21 ... Bt u t hai s 0 v 1, tip sau cc s Fibonaci sau bng tng ca 2 s Fibonaci trc n. Dy Fibonaci c th nh ngha qui nh sau: fibonaci(0) = 0; fibonaci(1) = 1;

fibonaci(n) = fibonaci(n-1) + fibonaci(n-2) n>1

Dy Fibonaci (tip)
/* Tnh dy s Fibonaci phng php qui */ #include <stdio.h> long fibo( long ); /* Hm nguyn mu */ main() { long result, n; printf("Hy nhp vo mt s nguyn : "); scanf("%ld", &n); result = fibo(n); printf("Fibonaci th %ld l : %ld\n", number, result); return 0; } /* nh ngha qui hm fibonaci */ long fibo( long n) { if ( n = 0 || n = 1 ) return n; else return fibo(n-1) + fibo(n-2); }

Li gi hm quy v iu kin dng ca thut gii quy


Bi ton gii bng thut gii quy phi c iu kin dng. Thut ton quy trn my tnh c th b gii hn bi dung lng b nh do li gi hm lin tip.

main

factorial (4)

factorial (3)

factorial (2)

factorial (1)

Hy v s tin trnh gi hm khi thc hin tnh dy fibonacci bng quy.

Bi ton Thp H Ni
C 3 ci ct v mt chng a ct th nht. Hy chuyn chng a sang ct th ba vi iu kin mi ln di chuyn ch mt a v cc a b lun nm trn a ln.
Truyn thuyt: lc th gii hnh thnh, trong ngi n th Brahma c mt chng 64 ci a. Mi ngy, c mt thy tu di chuyn mt a. n khi ht a th l ngy tn th.

Thut gii
Chuyn (n-1) a sang ct trung gian. Chuyn a ln nht sang ct ch. Chuyn (n-1) a t ct trung gian sang ct ch.

Ci t bng quy
1. MoveDisk(disk_number, starting_post, target_post, intermediate_post) 2. { 3. if(disk)number > 1) 4. { 5. MoveDisk(disk_number-1, starting_post, intermediate_post, target_post); 6. printf(Move disk number %d, from post %d to post %d.\n, disk_number, starting_post, target_post); 7. MoveDisk(disk_number-1,intermediate_post, target_post, starting_post); 8. } 9. else 10. printf(Move disk number 1 from post %d to post %d.\n, starting_post, target_post); 11. }

You might also like