Рекурс функц

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

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

Рекурсийг ашигласан хамгийн энгийн жишээ болох өгөгдсөн тооны факториалыг олох програмын рекурс ашиглан бичье.
#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 oruuln");
   scanf("%ld",&n);
   printf("Huvirgah toollin systemiig oruuln");
   scanf("%d",&k);
   convert(n,k);
return 0;  
}

Comments

Popular Posts