Iterative va Recursive Funksiyalar C Dasturlash Tilida

Bu qo'llanmada biz "Iterative" va "Recursive" funksiyalarni batafsil ko'rib chiqamiz. Ikki yondashuv o'rtasidagi farqlarni tushunish, qachon va qaysi holatda qaysi yondashuvdan foydalanish kerakligini tushunishga yordam beradi. Har bir qismda biz amaliy misollar ko'rsatib, ularni kod satrlari orqali tushuntiramiz.

Iterative Funksiyalar (Tsikllar Yordamida)

Iterative yondashuvda muammolarni hal qilish uchun tsikllardan foydalaniladi. Bu yondashuvda kod qayta-qayta bir qator ishlarni bajarish uchun tsikllardan (masalan, for, while) foydalanadi.

Amaliy Misol: Faktorialni Hisoblash (Iterative Yondashuv)

Faktorial funksiyasi misolida, biz tsikl yordamida faktorialni hisoblaymiz.

Faktorial nima? Faktorial — bu 1 dan n gacha bo'lgan barcha butun sonlarning ko'paytmasi. Masalan:

5!=5×4×3×2×1=120

#include <stdio.h>

int factorial(int n) {
    int result = 1;
    for (int i = 1; i <= n; i++) {
        result *= i;
    }
    return result;
}

int main() {
    int num = 5;
    printf("Faktorial %d! = %d\n", num, factorial(num));
    return 0;
}

Qadam-baqadam tushuntirish:

  1. int factorial(int n) — Bu funksiyaning argumenti n, ya'ni faktoriali hisoblanadigan son.

  2. int result = 1; — Dastlab natijani 1 ga teng deb belgilaymiz, chunki 1 ko'paytuvchi element hisoblanadi.

  3. for (int i = 1; i <= n; i++) — Bu tsikl yordamida i 1 dan n gacha o'sadi va har safar result o'z-o'ziga i ni ko'paytiradi.

  4. result *= i; — Bu qadamda har safar result o'ziga i qiymatini ko'paytiradi.

  5. return result; — Natija qaytariladi.

  6. printf() — Asosiy funksiyada faktorialni chop etadi.

Recursive Funksiyalar (O'zini-o'zi Chaqaruvchi Funksiyalar)

Recursive yondashuv muammolarni o'zini o'zi chaqirish orqali hal qiladi. Recursive funksiyalar bazaviy holat va recursive chaqiruvlardan iborat. Recursive funksiyalar murakkab muammolarni kichikroq qismlarga ajratish uchun ishlatiladi.

Amaliy Misol: Faktorialni Hisoblash (Recursive Yondashuv)

Keling, shu faktorialni recursive yondashuv bilan qanday hisoblash mumkinligini ko'rib chiqamiz.

#include <stdio.h>

int factorial(int n) {
    if (n == 0 || n == 1) {
        return 1;  // Bazaviy holat: 0! va 1! = 1
    } else {
        return n * factorial(n - 1);  // O'zini-o'zi chaqirish
    }
}

int main() {
    int num = 5;
    printf("Faktorial %d! = %d\n", num, factorial(num));
    return 0;
}

Qadam-baqadam tushuntirish:

  1. if (n == 0 || n == 1) — Bu bazaviy holat, ya'ni rekursiyaning tugash sharti. Agar n 0 yoki 1 bo'lsa, funksiya 1 qaytaradi.

  2. return n * factorial(n - 1); — Recursive chaqiruv: n ni (n - 1) ning faktorialiga ko'paytiradi.

  3. Recursive funksiya har safar o'zidan kichikroq qiymatni chaqiradi va bazaviy holatga yetganda natijalarni qaytaradi.

Iterative va Recursive Funksiyalarni Taqqoslash

XususiyatIterative YondashuvRecursive Yondashuv

Kodning soddaligi

Oddiy va tushunarli, tsikllar yordamida

Murakkabroq, o'zini o'zi chaqiruvchi

Xotira sarfi

Kamroq xotira ishlatadi

Ko'proq xotira sarflaydi (stack frame)

Ishlash tezligi

Umuman tezroq ishlaydi

Ba'zi hollarda sekinroq

Murakkab muammolarni yechish

Oddiy muammolar uchun yaxshi

Murakkab muammolarni yechishda yaxshi

Amaliy Misol: Fibonacci Sonini Hisoblash

Iterative Yondashuv

Fibonacci sonlari qatori 0 va 1 dan boshlanib, har bir keyingi son oldingi ikkita sonning yig'indisi bilan aniqlanadi. Keling, Fibonacci sonini tsikl yordamida hisoblaylik.

#include <stdio.h>

int fibonacci(int n) {
    int a = 0, b = 1, next;
    if (n == 0) return a;
    for (int i = 2; i <= n; i++) {
        next = a + b;
        a = b;
        b = next;
    }
    return b;
}

int main() {
    int num = 10;
    printf("Fibonacci soni %d: %d\n", num, fibonacci(num));
    return 0;
}

Recursive Yondashuv

Endi Fibonacci sonini recursive yondashuv bilan ko'ramiz:

#include <stdio.h>

int fibonacci(int n) {
    if (n == 0) return 0;
    if (n == 1) return 1;
    return fibonacci(n - 1) + fibonacci(n - 2);  // O'zini-o'zi chaqirish
}

int main() {
    int num = 10;
    printf("Fibonacci soni %d: %d\n", num, fibonacci(num));
    return 0;
}

Recursive Funksiyalarning Afzalliklari va Kamchiliklari

Afzalliklari:

  • Recursive funksiyalar murakkab masalalarni sodda qilib ko'rsatadi.

  • Natural rekursiya, masalan, daraxt strukturasi yoki graf algoritmlarida samarali ishlaydi.

Kamchiliklari:

  • Recursive funksiyalar ko'p miqdorda stack xotirasidan foydalanadi. Katta sonlar bilan ishlaganda "stack overflow" xatosi yuzaga kelishi mumkin.

  • Ba'zi hollarda iterativ yondashuvdan sekinroq bo'lishi mumkin.

Iterative Funksiyalarning Afzalliklari va Kamchiliklari

Afzalliklari:

  • Iterative yondashuv ko'proq samarali va stack xotiradan tejamli foydalanadi.

  • Katta hajmdagi masalalarda "stack overflow" xavfi yo'q.

Kamchiliklari:

  • Kod ko'pincha murakkabroq ko'rinishi mumkin, ayniqsa, rekursiv yondashuv tabiiyroq bo'lgan masalalarda.

Iterative va Recursive Funksiyalarni Tanlash

  • Iterative yondashuv oddiy tsikl talab qiladigan vazifalarda qo'llaniladi va samaraliroq ishlaydi.

  • Recursive yondashuv ko'proq tabiiy bo'lgan muammolarda, masalan, daraxt yoki graf tuzilmalari bilan ishlashda afzal qilinadi.

Umid qilamanki, ushbu qo'llanma sizga iterative va recursive funksiyalar haqida tushuncha berdi. Misollar yordamida har bir qadamni amaliy tarzda ko'rib chiqdik, bu sizga kodni yaxshiroq tushunishga yordam beradi.

Last updated