2009/01/12

Рекурсив Функц

Програмчлалах үед хэргэгчийн функц нь шууд болон шууд бус аргаар өөрөө өөрийгөө дуудах боломж байдаг ба үүнийг рекурс хэмээн нэрийддэг. Рекурсийг ямар нэг түвшин дэх үзэгдэл нь түүний өмнөх түвшиний үзэгдэлээр тодорхойлогдох үйл явц гэж тодорхойлж болох юм.

Рекурсыг ашигласанаар програмчлалын кодчилолыг бага хэмжээтэй болгох, мод, граф мэт шаталсан зохион байгуулалттай бүтцүүтэй ажиллах боломжийг бүрдүүлж өгдөг ба програмын бичих, ойлгоход тун хялбархан болгодог.

Рекурсийг ашигласан хамгийн энгийн жишээ болох өгөгдсөн тооны факториалыг олох програмын рекурс ашиглан бичье.

#include <stdio.h>
int fact(int a){
if(a==1) return 1;
return a*fact(a-1);
}
main(){
int n;
scanf("%d",&n);
printf("%d",fact(n));
return 0;
}

fact функцийн { } хаалтан дотор байгаа бичиглэлийн эхний мөрийг рекурс дуусах нөхцөл гэж нэрлэдэг. Харин 2-р мөрөнд а тоог а-1 тооны факториалаар үржүүлсэн утгыг буцааж байгаа ба энэ нь fact функц нь ажиллах явцдаа а-1ийн факторалын олох fact функцийн дахин дуудаж байгаа хэрэг. Рекурс функц өөрөө өөрийгөө дуудахдаа өмнөх утгаа компьютрийн стек санах ойд хадгалж байдаг. Харин төгсгөх нөхцөлд хүрмэгцээ өмнөх санах ойд хадгалсан утгуудаа дэс дараалан үржүүлж утгаа fact функцээр дамжуулан буцаана.

Харин одоо арай өөр рекурс шийдэлтэй програмыг бичиж үзье.
Өгсөн 10-тын тооллын системийн тоог хэрэглэгчээс авсан дурын k тооллын систем рүү (16-тын тооллын систем хүртэл. Хэрэв хүсвэл 16-таас илүү тоолын системд хөрвүүлэхээр бичиж болно.) хөрвүүлж хэвлэх програмыг доор сийрүүлэв.

#include <stdio.h>
long convert(long n,int k){
if(n){/*Энэ мөр нь рекурс функцийн төгсгөх
нөхцөл болж байна. n=0 болмогц convert
функц өөрөө өөрийгөө дуудахаа зогсооно.
n>0 үед л биелэнэ гэсэн үг */
convert(n/k,k);/*Энэ хэсэг функц өөрөө
өөрийгөө дуудаж байна.*/
switch(n%k){
case 0:printf("0"); break;
case 1:printf("1"); break;
case 2:printf("2"); break;
case 3:printf("3"); break;
case 4:printf("4"); break;
case 5:printf("5"); break;
case 6:printf("6"); break;
case 7:printf("7"); break;
case 8:printf("8"); break;
case 9:printf("9"); break;
case 10:printf("A"); break;
case 11:printf("B"); break;
case 12:printf("C"); break;
case 13:printf("D"); break;
case 14:printf("E"); break;
case 15:printf("F"); break;
}
}
}
int main(){
long n;
int k;
printf("N naturgal toog oruul\n");
scanf("%ld",&n);
printf("Huvirgah toollin systemiig oruul\n");
scanf("%d",&k);
convert(n,k);
return 0;
}

Функц маань төгсгөх нөхцөлд хүрмэгцээ санах ойд хадгалсан тэмдэгтүүдээ буцаан хэвлэж байгааг анзаарсан байх. Тоонуудыг тоолын системүүдэд шилжүүлэх талаар урьд өмнө нь бичиж байсан учраас энэ талаар дэлгэрэнгүй бичилгүй орхилоо. Хэрэв хүсвэл энд дарж үзэж болно.

3 comments:

  1. Sonirholtoi bichjee, GOOD LUCK!. Yamar negen functs duudagdah ued sanah oid stack butetsteigeer zohion baiguulagdaj ajilladag. Recurse hiih ued neg bichigdsen code-n deer uusdeggui /Ram-n deer uusdeggui/, harin shineer code-uud n stack mujid orj ajilladag. Herwee recursiin duusgah nuhtsul n buruu tawigdsan logiciin aldaatai bol stack duurlee gesen aldaa buyu STACK OVERFLOW gesen aldaa ugdug.

    ReplyDelete
  2. Урам өгсөнд маш их баярлалаа.

    ReplyDelete
  3. This comment has been removed by the author.

    ReplyDelete

Миний бичсэн бичлэг танд өчүүхэн ч болтугай хэрэг болсон бол сэтгэгдлээ бичиж үлдээхийг хүсье. Баярлалаа :)