O'zgaruvchan sondagi parametrlar funksiyalari
Agar funksiyaning formal parametrlar ro'yxati ko'p nuqta bilan tugasa, bu uni chaqirishda bu joyda yana bir nechta parametrlarni ko'rsatish mumkinligini bildiradi. Bu parametrlar uchun tiplar mosligini tekshirish bajarilmaydi, char va shortlar int kabi, float esa – double kabi uzatiladi. Misol sifatida prototipi
int printf(const char*, …);
ko'rinishga ega printf funksiyani keltirish mumkin.
Bu funksiyani chaqirish hech bo'lmaganda char* tipidagi parametrlarni o'z ichiga olishi va boshqa parametrlarni yo o'z ichiga olishi yoki olmasligi mumkin:
prinf("Dastlabki ma'lumotlarni kiriting"); // bir paremetr
prinf("Yig'indi: %5.2f so'm", sum); // ikkita paremetr
printf("%d %d %d %d", a, b, c, d); // beshta paremetr
Funksiya ichiga majburiy bo'lmagan parametrlarga kirish uchun sarlavhali faylda joylashgan va_start, va_arg va va_end kutubxonalari makroslaridan foydalaniladi.
Kompilyator tiplar nazorati uchun axborotga ega bo'lmagani uchun o'zgaruvchan sonli parametrlarga ega funksiya o'rniga jimlik bo'yicha parametrlardan yoki yuklanishi ortib ketgan funksiyalardan foydalansh afzalroq, vaholanki o'zgaruvchan sonli parametrlar bo'lgan holler yaxshi yechim hisoblanadi.
Rekursiv funksiyalar
Rekursiv deb o'z-o'zini chaqiradigan funksiyaga aytiladi. Bunday rekursiya to'g'ri deb ataladi. Yana bilvosita rekursiya ham mavjud, unda ikki va undan ortiq funksiyalar bir-birini chaqiradi. Agar funksiya o'zini chaqirsa, stekda uning parametrlar qiymatlari odatdagi funksiyani chaqirishdagi kabi nusxasi saqlanadi va shundan so'ng boshqaruv funksiyaning birinchi bajariluvchi operatoriga uzatiladi. Takroriy chaqirishda bu jarayon takrorlanadi. Ravshanki hisoblashlarni tugallash uchun har bir rekursiv funksiya qaytish operatori bilan tugallanuvchi hech bo'lmaganda algoritmning rekursiv bo'lmagan tartibini o'z ichiga olishi lozim. Funksiya tugaganda stekning mos qismi tozalanadi va boshqaruv rekursiv chaqiruvdagi keyin keladigan nuqtada bajarilishini davom ettiriladigan chaqiriluvchi funksiyaga uzatiladi.
Rekursiv funksiyaning klassik misoli bo'lib, faktorialni hisoblash hisoblanadi (bu faktorialni xuddi shunday hisoblash kerak degani emas). Buning uchun n sonining faktorialini toppish uchun n chi (n-1) conining faktorialiga ko'ytirish talab etiladi. Ma'lumki, 0!=1 va 1!=1.
long fact(long n){
if (n==0 | | n==1) return 1;
return (n * fact(n – 1));
}
O'shani qisqaroq yozish mumkin:
long fact(long n){
return (n>1) ? n * fact(n – 1) : 1;
}
Rekursiv funksiyalar ko'proq rekursiv algoritmlar kompakt amalga oshirish uchun hamda rekursiv tavsiflangan ma'lumotlar strukturalari bilan, masalan, ikkilik daraxtlarga ega strukturalar bilan ishlash uchun qo'llaniladi. Ixtiyoriy rekursiv funksiyani rekursiyani qo'llamasdan amalga oshirish mumkin, buning uchun dasturchi barcha zarur ma'lumotlarni saqlashni mustaqil ta'minlashi lozim. Rekursiya afzalligi kompakt yozuv hisoblanadi, kamchiliklari-funksiya takroriy chaqirishlariga vaqt va xotirani sarflash va unga parametrlar nusxalarini uzatish va asosiysi, stekni to'lib ketish xavfi.
Do'stlaringiz bilan baham: |