Rekursiv algoritm: tavsif, tahlil, xususiyatlar va misollar

Mundarija:

Rekursiv algoritm: tavsif, tahlil, xususiyatlar va misollar
Rekursiv algoritm: tavsif, tahlil, xususiyatlar va misollar
Anonim

Rekursiyaning zamonaviy tushunchasi: funksionallikning ta'rifi va unga tashqaridan va ushbu funksionallikdan kirish. Rekursiya matematiklar tomonidan tug'ilgan, deb ishoniladi: faktoriy hisoblash, cheksiz qatorlar, fraktallar, davomli kasrlar … Biroq, rekursiyani hamma joyda topish mumkin. Ob'ektiv tabiiy qonunlar rekursiyani o'zining asosiy algoritmi va ifodalash (mavjudlik) shakli sifatida moddiy olam ob'ektlarining ko'pchiligini emas, balki umuman harakatning asosiy algoritmini "ko'rib chiqadi".

rekursiv algoritm
rekursiv algoritm

Fan va texnikaning turli sohalaridagi turli mutaxassislikdagi odamlar f (x) rekursiv algoritmidan foydalanadilar, bu erda "x ~/=f (x)". O'zini chaqiradigan funksiya kuchli yechim, lekin bu yechimni shakllantirish va tushunish ko'p hollarda juda qiyin ish.

Qadimda saroy maydonini kengaytirish uchun rekursiyadan foydalanilgan. Bir-biriga qaratilgan nometall tizimi orqali siz ajoyib uch o'lchamli fazoviy effektlarni yaratishingiz mumkin. Ammo buni qanday tushunish juda osonbu oynalarni sozlaysizmi? Kosmosdagi nuqta qayerda ekanligini, bir nechta oynalar orqali aks etishini aniqlash yanada qiyinroq.

Rekursiya, rekursiv algoritmlar: ma'no va sintaksis

Amallar ketma-ketligini takrorlash orqali tuzilgan muammoni rekursiv hal qilish mumkin. Oddiy algoritm (kvadrat tenglamani hisoblash, veb-sahifani ma'lumot bilan to'ldirish uchun skript, faylni o'qish, xabar yuborish…) rekursiyani talab qilmaydi.

Rekursiv yechimga imkon beruvchi algoritmning asosiy farqlari:

  • bir necha marta bajarilishi kerak boʻlgan algoritm mavjud;
  • algoritm har safar oʻzgarib turadigan maʼlumotlarga muhtoj;
  • algoritm har safar oʻzgarishi shart emas;
  • yakuniy shart bor: algoritm rekursiv - cheksiz emas.

Umuman olganda, bir martalik ijro rekursiya uchun sabab yo'qligining zaruriy sharti ekanligi haqida bahslasha olmaydi. Shuningdek, siz majburiy yakuniy shartni talab qila olmaysiz: cheksiz rekursiyalarning oʻz doirasi bor.

Algoritm rekursivdir: amallar ketma-ketligi qayta-qayta bajarilganda, har safar oʻzgarib turadigan va har safar yangi natija beradigan maʼlumotlarda.

Rekursiya formulasi

Rekursiya va uning dasturlashdagi analogini matematik tushunish har xil. Matematika, garchi dasturlash belgilari mavjud bo'lsa-da, lekin dasturlash ancha yuqori darajadagi matematika.

rekursiv algoritm f
rekursiv algoritm f

Toʻgʻri yozilgan algoritm oʻz muallifining aql-zakovati koʻzgusiga oʻxshaydi. Generaldasturlashda rekursiya formulasi "f(x)", bunda "x ~/=f(x)" kamida ikkita talqinga ega. Bu erda "~" natijaning o'xshashligi yoki yo'qligi, "=" esa funksiya natijasining mavjudligi.

Birinchi variant: ma'lumotlar dinamikasi.

  • f(x)" funksiyasi rekursiv va oʻzgarmas algoritmga ega;
  • "x" va "f(x)" natijasi har safar yangi qiymatlarga ega, "f(x)" natijasi bu funksiyaning yangi "x" parametridir.

Ikkinchi variant: kod dinamikasi.

  • "f(x)" funksiyasi ma'lumotlarni aniqlaydigan (tahlil qiluvchi) bir nechta algoritmlarga ega;
  • ma'lumotlar tahlili - kodning bir qismi va kerakli amalni bajaradigan rekursiv algoritmlarni amalga oshirish - kodning ikkinchi qismi;
  • f(x) funksiyasining natijasi emas.

Natija normal emas. Dasturlash matematika emas, bu erda natija aniq bo'lishi shart emas. Rekursiv funksiya oddiygina saytlarni tahlil qilishi va maʼlumotlar bazasini toʻldirishi yoki kiruvchi maʼlumotlarga koʻra obʼyektlarni yaratishi mumkin.

Ma'lumotlar va rekursiya

Rekursiv algoritmlarni dasturlash faktorialni hisoblashdan iborat emas, bunda funksiya har safar bittadan koʻp yoki birdan kichik boʻlgan berilgan qiymatni oladi – amalga oshirish varianti ishlab chiquvchining xohishiga bogʻliq.

Faktorial "8" qanday bo'lishi muhim emas,bu formulaga qatʼiy amal qiladigan algoritm.

Ma'lumotni qayta ishlash - bu butunlay boshqacha tartibdagi "matematika". Bu erda rekursiv funksiyalar va algoritmlar harflar, so'zlar, iboralar, jumlalar va paragraflar ustida ishlaydi. Har bir keyingi daraja oldingisidan foydalanadi.

Kirish ma'lumotlar oqimi turli sharoitlarda tahlil qilinadi, lekin tahlil jarayoni odatda rekursivdir. Kirish oqimining barcha variantlari uchun noyob algoritmlarni yozishning ma'nosi yo'q. Bitta funksionallik bo'lishi kerak. Bu erda rekursiv algoritmlar kirishga mos keladigan chiqish oqimini qanday shakllantirishga misollardir. Bu rekursiv algoritmning natijasi emas, lekin kerakli va kerakli yechim.

Abstraktsiya, rekursiya va OOP

Ob'ektga yo'n altirilgan dasturlash (OOP) va rekursiya bir-biridan tubdan farq qiladi, lekin ular bir-birini mukammal ravishda to'ldiradi. Abstraktsiyaning rekursiyaga aloqasi yo'q, lekin OOP ob'ektivi orqali u kontekstli rekursiyani amalga oshirish imkoniyatini yaratadi.

Masalan, ma'lumotlar tahlil qilinmoqda va harflar, so'zlar, iboralar, jumlalar va paragraflar alohida ajratilgan. Shubhasiz, ishlab chiquvchi ushbu besh turdagi ob'ektlarning namunalarini yaratishni ta'minlaydi va har bir darajadagi rekursiv algoritmlar yechimini taklif qiladi.

rekursiv algoritmlarni dasturlash
rekursiv algoritmlarni dasturlash

Ayni paytda, agar harflar darajasida "ma'no izlashning ma'nosi yo'q" bo'lsa, unda semantika so'zlar darajasida paydo bo'ladi. Siz so'zlarni fe'llarga, otlarga, qo'shimchalarga, old qo'shimchalarga bo'lishingiz mumkin… Siz oldinga borib, holatlarni belgilashingiz mumkin.

Frazalar darajasida semantika tinish belgilari va mantiq bilan to'ldiriladiso'z birikmalari. Gaplar darajasida semantikaning yanada mukammal darajasi topiladi va paragrafni to'liq fikr deb hisoblash mumkin.

Ob'ektga yo'n altirilgan rivojlanish xususiyatlar va usullarning merosini oldindan belgilab beradi va ob'ektlar ierarxiyasini butunlay mavhum ajdodni yaratishdan boshlashni taklif qiladi. Shu bilan birga, shubhasiz, har bir naslning tahlili rekursiv bo'ladi va texnik darajada ko'p pozitsiyalarda (harflar, so'zlar, iboralar va jumlalar) juda ko'p farq qilmaydi. Paragraflar, toʻliq fikrlar kabi, bu roʻyxatda ajralib turishi mumkin, ammo ular mohiyat emas.

Algoritmning katta qismini mavhum ajdodlar darajasida shakllantirish, uni mavhum darajadan chaqirilgan ma'lumotlar va usullar bilan har bir avlod darajasida aniqlashtirish muhimdir. Shu nuqtai nazardan, abstraksiya rekursiya uchun yangi ufqlarni ochadi.

OOPning tarixiy xususiyatlari

OOP dasturiy ta'minot olamiga ikki marta keldi, garchi ba'zi ekspertlar bulutli hisoblashning paydo bo'lishini va ob'ektlar va sinflar haqidagi zamonaviy g'oyalarni IT texnologiyalari rivojlanishining yangi bosqichi sifatida ta'kidlashlari mumkin.

OOPning zamonaviy kontekstidagi "ob'ekt" va "ob'ektiv" atamalari odatda o'tgan asrning 50-60-yillariga tegishli, ammo ular 1965 yil va Simula, Lisp, Algol, Smalltalkning paydo bo'lishi bilan bog'liq..

Oʻsha kunlarda dasturlash unchalik rivojlanmagan va inqilobiy tushunchalarga munosib javob bera olmas edi. G'oyalar va dasturlash uslublari (C / C ++ va Paskal - asosan) kurashi hali ham uzoq edi va ma'lumotlar bazalari hali ham kontseptual tarzda shakllantirildi.

rekursiv rekursiv algoritmlar
rekursiv rekursiv algoritmlar

80-yillarning oxiri va 90-yillarning boshlarida Paskalda ob'ektlar paydo bo'ldi va hamma C / C ++ tilidagi darslarni esladi - bu OOPga qiziqishning yangi bosqichini ko'rsatdi va aynan o'sha paytda asboblar, birinchi navbatda dasturlash tillari o'zgacha bo'lib qoldi. faqat ob'ektga yo'n altirilgan g'oyalarni qo'llab-quvvatlaydi, lekin shunga mos ravishda rivojlaning.

Albatta, agar ilgari rekursiv algoritmlar dasturning umumiy kodida faqat funksiyalardan foydalanilgan boʻlsa, endi rekursiya obʼyekt (sinf) xossalarining bir qismiga aylanishi mumkin boʻlib, bu meros kontekstida qiziqarli imkoniyatlarni taʼminlagan.

Zamonaviy OOP xususiyati

OOPning rivojlanishi dastlab ob'ektlarni (sinflarni) ma'lumotlar va xususiyatlar (usullar) to'plami sifatida e'lon qildi. Aslida, bu sintaksis va ma'noga ega bo'lgan ma'lumotlar haqida edi. Ammo keyin OOP ni haqiqiy ob'ektlarni boshqarish vositasi sifatida taqdim etishning iloji bo'lmadi.

rekursiv funksiyalar va algoritmlar
rekursiv funksiyalar va algoritmlar

OOP "kompyuter tabiati" obyektlarini boshqarish vositasiga aylandi. Skript, tugma, menyu bandi, menyu satri, brauzer oynasidagi teg obyekt hisoblanadi. Lekin mashina, oziq-ovqat mahsuloti, so'z yoki jumla emas. Haqiqiy ob'ektlar ob'ektga yo'n altirilgan dasturlashdan tashqarida qoldi va kompyuter vositalari yangi mujassamlashdi.

Ommabop dasturlash tillaridagi farqlar tufayli OOPning koʻplab dialektlari paydo boʻldi. Semantika nuqtai nazaridan ular amalda tengdir va ularning qo'llaniladigan sohaga emas, balki instrumental sohaga yo'n altirilganligi real ob'ektlarning tavsifini chegaradan tashqarida olishga imkon beradi.algoritmlar va ularning platformalararo va tillararo "mavjudligini" ta'minlang.

Staklar va funksiyalarni chaqirish mexanizmlari

Funktsiyalarni (protseduralar, algoritmlar) chaqirish mexanizmlari ma'lumotlarni (parametrlarni) uzatishni, natijani qaytarishni va funksiya (protsedura) tugagandan so'ng boshqaruvni qabul qilishi kerak bo'lgan operator manzilini eslab qolishni talab qiladi.

Rekursiv algoritmlarga misollar
Rekursiv algoritmlarga misollar

Odatda bu maqsadda stekdan foydalaniladi, garchi dasturlash tillari yoki ishlab chiquvchining oʻzi boshqaruvni uzatish uchun turli xil variantlarni taqdim etishi mumkin. Zamonaviy dasturlash funksiyaning nomi faqat parametr bo'lishi mumkin emasligini tan oladi: u algoritmni bajarish jarayonida shakllantirilishi mumkin. Algoritm boshqa algoritmni bajarayotganda ham yaratilishi mumkin.

Rekursiv algoritmlar kontseptsiyasi, ularning nomlari va tanasi vazifani shakllantirish vaqtida aniqlanishi mumkin bo'lsa (kerakli algoritmni tanlash), rekursivlikni nafaqat biror narsani qanday qilish, balki kim aniq bajarishi kerakligiga ham ta'minlaydi. qiling. Algoritmni "ma'noli" nomi bilan tanlash istiqbolli, ammo qiyinchiliklar tug'diradi.

Funktsiyalar to'plamida rekursivlik

Algoritm o'zini chaqirganda uni rekursiv deb ayta olmaysiz va tamom. Dasturlash - bu dogma emas va rekursivlik tushunchasi o'zingizni algoritmingiz tanasidan chaqirish uchun maxsus talab emas.

Amaliy ilovalar har doim ham toza yechim bermaydi. Ko'pincha, dastlabki ma'lumotlar tayyorlanishi kerak va rekursiv chaqiruvning natijasi butun muammo (butun algoritm) kontekstida tahlil qilinishi kerak.umumiy.

Aslida, rekursiv funksiya chaqirilishidan oldin emas, balki u tugallangandan keyin ham boshqa dastur chaqirilishi mumkin yoki kerak. Agar qo'ng'iroq bilan bog'liq maxsus muammolar bo'lmasa: rekursiv A() funksiyasi B() funksiyasini chaqiradi, u biror narsani bajaradi va A() ni chaqiradi, keyin darhol boshqaruvni qaytarish bilan bog'liq muammo yuzaga keladi. Rekursiv qo'ng'iroqni tugatgandan so'ng, A() funktsiyasi uni qayta chaqiradigan B() ni qayta chaqirish uchun boshqaruvni qabul qilishi kerak. Boshqaruvni stekdagi tartibda bo'lishi kerak bo'lgan tarzda B() ga qaytarish noto'g'ri yechim.

Dasturchi parametrlarni tanlashda cheklanmaydi va ularni funksiya nomlari bilan toʻldirishi mumkin. Boshqacha qilib aytganda, ideal yechim B() nomini A() ga o‘tkazish va A() ning o‘zi B() ni chaqirishi mumkin. Bunday holda, boshqaruvni qaytarish bilan bog'liq muammolar bo'lmaydi va rekursiv algoritmni amalga oshirish shaffofroq bo'ladi.

Tushunish va rekursiya darajasi

Rekursiv algoritmlarni ishlab chiqishda muammo shundaki, jarayon dinamikasini tushunishingiz kerak. Ob'ekt usullarida, ayniqsa mavhum ajdod darajasida rekursiyadan foydalanilganda, o'z algoritmingizni uning bajarilish vaqti kontekstida tushunish muammosi mavjud.

rekursiv algoritmlarni yechish
rekursiv algoritmlarni yechish

Hozirda qoʻngʻiroq mexanizmlarida funksiyalarni joylashtirish darajasi va stek sigʻimi boʻyicha hech qanday cheklovlar yoʻq, ammo tushunish muammosi mavjud: vaqtning qaysi nuqtasida maʼlumotlar darajasi yoki umumiy algoritmda qaysi joy rekursiv deb ataladi. funksiyasi va o‘zi qancha qo‘ng‘iroq qilayotgani.

Mavjud nosozliklarni tuzatish vositalari ko'pincha kuchsizdirdasturchiga to'g'ri yechimni ayting.

Looplar va rekursiya

Tsiklik bajarilish rekursiyaga ekvivalent deb hisoblanadi. Darhaqiqat, ba'zi hollarda rekursiv algoritm shartli va tsiklik tuzilmalar sintaksisida amalga oshirilishi mumkin.

Ammo, agar ma'lum bir funktsiyani rekursiv algoritm orqali amalga oshirish kerakligi haqida aniq tushuncha mavjud bo'lsa, tsikl yoki shartli iboralardan har qanday tashqi foydalanishdan voz kechish kerak.

rekursiv algoritmlarni amalga oshirish
rekursiv algoritmlarni amalga oshirish

Bu erda ma'no shundan iboratki, o'z-o'zidan foydalanadigan funksiya ko'rinishidagi rekursiv yechim to'liq, funktsional jihatdan to'liq algoritm bo'ladi. Bu algoritm dasturchidan algoritm dinamikasini tushunib, kuch bilan yaratishni talab qiladi, ammo bu tashqi boshqaruvni talab qilmaydigan yakuniy yechim boʻladi.

Tashqi shartli va siklik operatorlarning har qanday birikmasi rekursiv algoritmni toʻliq funksiya sifatida koʻrsatishga imkon bermaydi.

Rekursion konsensus va OOP

Rekursiv algoritmni ishlab chiqishning deyarli barcha variantlarida ikkita algoritmni ishlab chiqish rejasi vujudga keladi. Birinchi algoritm kelajakdagi ob'ektlar (nasollar) ro'yxatini yaratadi va ikkinchi algoritm aslida rekursiv funksiyadir.

Eng yaxshi yechim rekursiyani rekursiv algoritmni oʻz ichiga olgan yagona xususiyat (usul) sifatida tashkil qilish va barcha tayyorgarlik ishlarini obʼyekt konstruktoriga qoʻyish boʻladi.

Rekursiv algoritm faqat ishlaganda toʻgʻri yechim boʻladifaqat o'zi tomonidan, tashqi nazorat va boshqaruvsiz. Tashqi algoritm faqat ishlash uchun signal berishi mumkin. Bu ish natijasi kutilgan yechim boʻlishi kerak, tashqi yordamsiz.

Rekursiya har doim toʻliq mustaqil yechim boʻlishi kerak.

Intuitiv tushunish va funksional toʻliqlik

Obyektga yoʻn altirilgan dasturlash de-fakto standartga aylanganda, samarali kodlash uchun oʻz fikringizni oʻzgartirishingiz kerakligi ayon boʻldi. Algoritmni bajarish jarayonida dasturchi til sintaksisi va semantikasidan semantika dinamikasiga o‘tishi kerak.

Rekursiyaning oʻziga xos xususiyati: uni hamma narsaga qoʻllash mumkin:

  • veb qirqish;
  • qidiruv operatsiyalari;
  • matn ma'lumotlarini tahlil qilish;
  • MS Word hujjatlarini oʻqish yoki yaratish;
  • teglardan namuna olish yoki tahlil qilish…

OOPning xarakteristikasi: bu mavhum ajdod darajasida rekursiv algoritmni tavsiflash imkonini beradi, lekin uning har biri oʻziga xos maʼlumotlar va xususiyatlar palitrasiga ega boʻlgan noyob avlodlarga murojaat qilishni taʼminlaydi.

rekursiv algoritmlar tushunchasi
rekursiv algoritmlar tushunchasi

Rekursiya ideal, chunki u algoritmning funksional toʻliqligini talab qiladi. OOP rekursiv algoritmning unumdorligini yaxshilaydi va unga barcha noyob bolalar uchun ruxsat beradi.

Tavsiya: