• Rekursiv funksiyalar.
  • Информатика




    Download 7,16 Mb.
    Pdf ko'rish
    bet159/308
    Sana30.05.2024
    Hajmi7,16 Mb.
    #257687
    1   ...   155   156   157   158   159   160   161   162   ...   308
    Bog'liq
    Информатика

    Leksik analiz.
    Kiritilgan ifoda haqiqiy sonligini tekshiruvchi dastur: 
    33-listing
    .
    Output: 
    #include  
    void Main() 
    { int k=1; m=0; char c; 
    while (c!=`\n`) { 
    if ((c=`.`) && (m=0)) {m=1; continue }; 
    if ((c<`0`) || (c>`9`)) {k=0; break}; } 
    if (k) cout<<“\n Haqiqiy son”; else cout<<“\n Haqiqiy son emas”;} 
    Keyingi dasturimizda kiritilayotgan ifoda identifikator yoki yo`qligi tekshiriladi: 
    34-listing
    .
    Output:
    #include  
    void Main() 
    { int k=0; char c; 
    while (c!=`\n`) 
    {if (k==-1) break; 
    m=2; 
    if ((c>=`0`) && (c<=`9`)) m=0; 


    259 
    if ((c>=`a`) && (c<=`Z`)) m=1; 
    if (c==`_`) m=1; } 
    switch(m) 
    { case 0: if (k==0) k=-1;break; 
    case 1: k=1;beak; 
    default: k=-1;break; } } 
    if (k=-1) cout<<(“\n Identifikator emas”); else cout<<(“\n Identifikator”); }
    Rekursiv funksiyalar.
    Rekursiv funksiya deb, o`ziga o`zi murojaat qiluvchi 
    funksiyaga aytiladi. Masalan, faktorialni hisoblash funksiyasini keltiramiz: 
    39-listing.
    Output: 
    Long fact(int k) 
    {if (k<0) return 0; 
    if (k==0) return 1; 
    return k*fact(k-1); } 
    Manfiy argument uchun funksiya 0 qiymat qaytaradi. Parametr 0 ga teng 
    bo`lsa funksiya 1 qiymat qaytaradi. Aks holda, parametr qiymat birga 
    kamaytirilgan holda funksiyaning o`zi chaqiriladi va uzatilgan parametrga 
    ko`paytiriladi. Funksiyaning o`z - o`zini chaqirish formal parametr qiymati 0 ga 
    teng bo`lganda to`xtatiladi. Keyingi misolimizda ixtiyoriy haqiqiy sonning butun 
    darajasini hisoblash rekursiv funksiyasini keltiramiz. 
    40-listing.
    Output: 
    Double expo(double a, int n) 
    { if (n==0) return 1; 
    if (a==0.0) return 0; 
    if (n>0) return a*expo(a,n-1); 
    if(n<0) return expo(a,n+1)/a; } 
    Funksiyaga expo(2.0,3) shaklda murojaat qilinganda rekursiv ravishda 
    funksiyaning ikkinchi parametri kamaygan holda murojaatlar hosil bo`ladi: 


    260 
    Expo(2.0,3), expo(2.0,2), expo(2.0,1), expo(2.0,0).
    Bu murojaatlarda quyidagi 
    ko`paytma hisoblanadi: 
    2.0*2.0*2.0*1
    va kerakli natija hosil qilinadi. Shuni 
    ko`rsatib o`tish kerakki, bu funksiyamizda noaniqlik mavjuddir ya`ni 0.0 ga teng 
    sonning 0 chi darajasi 0 ga teng bo`ladi. Matematik nuqtai nazardan bo`lsa, bu 
    holda noaniqlik kelib chiqadi. Yuqoridagi sodda misollarda rekursiyasiz iterativ 
    funksiyalardan foydalanish maqsadga muvofiqdir. Masalan, darajani hisoblash 
    funksiyani quyidagicha tuzish mumkin: 
    41-listing.
    Output: 
    Double expo(double a, int n) 
    { if (n==0) return 1; 
    if (a==0.0) return 0; 
    int k=(n>0)?n:-n; 
    for(double s=1.0, int i=0; iif (n>0) return s else return 1/s; } 
    Rekursiyaga misol sifatida sonni satr shaklida chiqarish masalasini ko`rib 
    chiqamiz. Son raqamlari teskari tartibda hosil bo`ladi. Birinchi usulda raqamlarni 
    massivda saqlab so`ngra teskari tartibda chiqarishdir. 
    Rekursiv usulda funksiya har bir chaqiriqda bosh raqamlardan nusxa olish 
    uchun o`z - o`ziga murojaat qiladi, so`ngra oxirgi raqamni bosib chiqaradi. 
    42-listing. print n in decimal (recursive)
    Output: 
    printd(n)
    int n; 
    ( int i;
    if (n < 0)
    putchar(`-`); 
    n = -n; 
    if ((i = n/10) != 0) 


    261 
    printd(i); 
    putchar(n % 10 + `0`); ) 
    PRINTD(123)
    chaqiriqda birinchi funksiya PRINTD N = 123 qiymatga ega. 
    U 12 qiymatni ikkinchi PRINTD ga uzatadi, boshqarish o`ziga qaytganda 3 ni 
    chiqaradi. 
    

    Download 7,16 Mb.
    1   ...   155   156   157   158   159   160   161   162   ...   308




    Download 7,16 Mb.
    Pdf ko'rish