rekursiv usul

DOC 13 pages 111.5 KB Free download

Page preview (5 pages)

Scroll down 👇
1 / 13
7-ma'ruza rekursiv usul misol tariqasida 1 dan n gacha natural sonlar yig’indisini ko'rib chiqaylik. c# da sikl operatori yordamida hal qilish algoritmi quyidagicha yozilishi mumkin: int sum(int n) { int s = 0; for (int i = 1; i 0) { s += n; --n; } return s; } oxirgi algoritmda yig‘indini hisoblaymiz, masalan, n=5 uchun u 5+4+3+2+1 ga teng bo‘ladi, uni 5+(4+(3+(2+(1))))) shaklida yozish mumkin, ya'ni biz 5 soniga kamaygan ketma-ketlikning yig'indisini qo'shamiz. yuqoridagilarni hisobga olib algoritmimizni yozamiz: int sum(int n) { return n + sum(n - 1); } muammoning rekursiv yechimiga ega bo‘ldik, ya’ni sum funksiyasi o‘zini argumentning kamaygan qiymati bilan chaqiradi. rekursiv yechim estafetali uzatishga o'xshaydi. kimdir sizga 5 soni uchun yig'indini hisoblashni aytadi. siz bu yig’indi 5 soni va undan oldingi 4 ta sonlar yigindisiga teng ekanligini bilasiz, shuning uchun siz boburga qo'ng'iroq qilasiz va unga 4 soni uchun yig'indisini hisoblashni aytasiz. uning javobini olgach, siz …
2 / 13
(n == 1) return 1; return n + sum(n - 1); } rekursiv usulning boshqaruvni keyingi rekursiv chaqiruvsiz qaytarishiga olib keladigan shart tayanch cheklash deb ataladi. har bir rekursiv usul cheksiz rekursiyani va keyinchalik dasturning ishdan chiqishini oldini olish uchun tayanch cheklovga ega bo'lishi kerak. rekursiv funktsiyadan foydalangan holda to'liq dastur quyidagicha bo’ladi: using system; namespace recursiya { class program { static void main(string[] args) { int sum(int n) { if (n == 1) return 1; return n + sum(n - 1); } int n; console.writeline("kiriting n = :"); n = int.parse(console.readline()); console.writeline($"yig’indi: {sum(n)}"); console.readkey(); } } } bu qanday ishlaydi? keling, sum() funktsiyasini biroz o'zgartiraylik, shunda u bajarilishi paytida nima sodir bo'lishi haqida ma'lumot beradi. qo'shimcha chop qilish buyruqlari argumentlarni va qaytariluvchi qiymatlarni kuzatishga yordam beradi: int sum(int n) { console.writeline($"chaqiruv: n ={n}"); if (n == 1) { console.writeline("qaytarildi: 1"); return 1; } int s = n + sum(n …
3 / 13
rsiv chaqiruv soddalashtirilgan masalani hal qilish uchun mo'ljallangan. · muammoning etarlicha sodda versiyasi mavjud, bu usul uni hal qilishi va rekursiyasiz qaytishi mumkin. rekursiv funktsiyaning har bir keyingi chaqiruvida argument qiymati kamayadi (yoki bir nechta argumentlar bilan belgilangan diapazon torayadi) - bu muammoni bosqichma-bosqich "soddalashtirish" namoyon bo’ladi. argument yoki diapazon ma'lum bir minimal o'lchamga yetganda, tayanch cheklov ishga tushadi va usul rekursiyasiz qaytadi. rekursiya qanchalik samarali? usulni chaqirish biroz qo'shimcha xarajatlarni o'z ichiga oladi. boshqaruv joriy chaqiruv nuqtasidan funktsiyaning boshiga o'tkazilishi kerak. bundan tashqari, usul argumentlari va qaytish manzili ichki stekga joylanadi, shunda funktsiya argument qiymatlariga murojat qila olishi va boshqaruvni qaysi manzil bo’yicha qaytarishni bilishi mumkin. sum() funksiyasi bilan bog'liq vaziyatda, ehtimol, shunday xarajatlar tufayli masalaning sikl yordamida yechimi rekursiv yechimga qaraganda tezroq bo'ladi. kechikish ahamiyatsiz bo'lishi mumkin, ammo ko'p sonli chaqiruvlar bilan rekursiyadan xalos bo'lish maqsadga muvofiqdir. samaradorlikni pasaytirishning yana bir omili - bu ichki stekdagi barcha oraliq …
4 / 13
n holda). yig'indiga o'xshab, n! faktorial uchun ham rekursiv funktsiyani yozish mumkin: int factorial(int n) { if (n == 0) return 1; return n * factorial(n - 1); } faktorial hisoblash rekursiyaning klassik namunasidir. rekursiv usullarni boshqa hisoblash masalalariga ham qoʻllash mumkin, masalan, ikki sonning eng katta umumiy karrasini hisoblash (kasrlarni kamaytirish uchun ishlatiladi), sonni darajaga koʻtarish va hokazo. biroq, avvalgi holatda boʻlgani kabi, bu yechimlar ham rekursiyani namoyish qilish uchun juda mos keladi, lekin amalda sikllarga asoslangan echimlar samaraliroq bo'ladi. anagrammalar rekursiyadan foydalanish masalani yechimini topish uchun eng ajoyib bo’lgan boshqa sohani ko'rib chiqamiz. o'zgartirish - ob'ektlarni ma'lum bir tartibda joylashtirish. aytaylik, biz ma'lum bir so'zning anagrammalarining to'liq ro'yxatini, ya'ni harflarning barcha mumkin bo'lgan almashtirishlarini (ular haqiqiy so'zlar yoki yo'qligidan qat'iy nazar) tuzmoqchimiz. masalan, cat so'zi uchun dastur quyidagi anagrammalar ro'yxatini chiqarishi kerak: cat cta atc ​​act tca tac anogrammada variantlar soni harflar sonining faktorialiga teng. uch harfli so'zda …
5 / 13
uchun oxirgi ikki harfni siklik siljitish deganda ularni o’rinlarini almashtirish tushuniladi. o’ngdagi n - 1 ta harflar uchun anagrammalar ro'yxati qanday tuziladi? rekursiv chaqiruv orqali. anagram() rekursiv protsedurasi anagrammalar tuziladigan so'z uzunligidagi bitta parametrini oladi. bu so'z dastlabki so'zning o'ng tarafidagi n ta harfi deb faraz qilinadi. har safar anagram() protsedurasi o'zini rekursiv chaqirganda, u bitta kam sondagi harf uchun shunday qiladi. tayanch cheklov anagrammalar tuziladigan so'z faqat bitta harfdan iborat bo'lganda yuzaga keladi. buning uchun yangi almashtirishlarni yaratish ma’no yo’q, shuning uchun protsedura darhol boshqaruvni qaytaradi. aks holda, u berilgan so'zning birinchi harfidan tashqari barcha harflarning anagrammalarini tuzadi va butun so'zni siklik siljitadi. bu ikki harakat n marta bajariladi, bu erda n - so'zning uzunligi. anagram() rekursiv protsedura kodi: void anagram(int newsize) { if (newsize == 1) { return; } for (int j = 0; j upperbound) return -1; if (a[curin] upperbound) return -1; if (a[curin] int.parse(s)); console.writeline("qidirilayotgan sonni …

Want to read more?

Download all 13 pages for free via Telegram.

Download full file

About "rekursiv usul"

7-ma'ruza rekursiv usul misol tariqasida 1 dan n gacha natural sonlar yig’indisini ko'rib chiqaylik. c# da sikl operatori yordamida hal qilish algoritmi quyidagicha yozilishi mumkin: int sum(int n) { int s = 0; for (int i = 1; i 0) { s += n; --n; } return s; } oxirgi algoritmda yig‘indini hisoblaymiz, masalan, n=5 uchun u 5+4+3+2+1 ga teng bo‘ladi, uni 5+(4+(3+(2+(1))))) shaklida yozish mumkin, ya'ni biz 5 soniga kamaygan ketma-ketlikning yig'indisini qo'shamiz. yuqoridagilarni hisobga olib algoritmimizni yozamiz: int sum(int n) { return n + sum(n - 1); } muammoning rekursiv yechimiga ega bo‘ldik, ya’ni sum funksiyasi o‘zini argumentning kamaygan qiymati bilan chaqiradi. rekursiv yechim estafetali uzatishga o'xshaydi. kimdir sizga 5 soni uchun yig'indini hisoblashni aytadi. siz bu yig’indi...

This file contains 13 pages in DOC format (111.5 KB). To download "rekursiv usul", click the Telegram button on the left.

Tags: rekursiv usul DOC 13 pages Free download Telegram