Mavzu: Rekursiv algoritmlar va ularning vazifalari.
Reja:
Rekursiv funktsiyalar va algoritmlar.
Ma'lumotlarning rekursiv turlari.
Rekursiya turlari.
Mavzuga doir misollar.
Foydalanilgan adabiyotlar.
Rekursiv funktsiyalar va algoritmlar.
Umumiy kompyuter dasturlash taktika - bu muammoni asl nusxadagi bir xil turdagi pastki muammolarga ajratish, ushbu kichik muammolarni echish va natijalarni birlashtirish. Bunga ko'pincha ajratish va zabt etish usuli; a bilan birikganda qidiruv jadvali sub-muammolarni echish natijalarini saqlaydigan (ularni qayta-qayta hal qilmaslik va qo'shimcha hisoblash vaqtiga yo'l qo'ymaslik uchun) dinamik dasturlash yoki yod olish.
Rekursiv funktsiya ta'rifi bir yoki bir nechtasiga ega asosiy holatlar, funktsiya natijani beradigan kirish (lar) ni anglatadi ahamiyatsiz (takrorlanmasdan), va bitta yoki bir nechtasi rekursiv holatlar, dastur takrorlanadigan kirish (lar) ni anglatadi (o'zini o'zi chaqiradi). Masalan, faktorial funktsiyani tenglamalar bilan rekursiv ravishda aniqlash mumkin 0! = 1 va hamma uchun n > 0, n! = n(n − 1)!. Ikkala tenglama ham o'z-o'zidan to'liq ta'rifni tashkil etmaydi; birinchisi - asosiy, ikkinchisi - rekursiv holat. Asosiy ish rekursiya zanjirini uzganligi sababli, ba'zan uni "tugatuvchi ish" ham deyishadi.
Rekursiv holatlarning ishi murakkab yozuvlarni oddiylariga ajratish sifatida qaralishi mumkin. To'g'ri ishlab chiqilgan rekursiv funktsiyasida, har bir rekursiv chaqiriq bilan, kiritish muammosi shunday soddalashtirilishi kerakki, oxir-oqibat asosiy holatga erishish kerak. (Oddiy sharoitlarda tugatish uchun mo'ljallanmagan funktsiyalar - masalan, ba'zilari tizim va server jarayonlari - bu bundan mustasno.) Asosiy ishni yozishga beparvolik qilish yoki uni noto'g'ri tekshirish, sabab bo'lishi mumkin cheksiz pastadir.
Ba'zi funktsiyalar uchun (masalan, seriyali uchun e = 1/0! + 1/1! + 1/2! + 1/3! + ...) kirish ma'lumotlari nazarda tutilgan aniq bazaviy holat mavjud emas; chunki bu qo'shilishi mumkin parametr (masalan, qator misolida qo'shiladigan atamalar soni kabi) asosiy holatni o'rnatadigan "to'xtash mezonini" ta'minlash uchun. Bunday misol tabiiy ravishda davolanadi kelishuv,[Qanaqasiga? ] bu erda mahsulotning ketma-ket shartlari qisman yig'indilar; buni indeksatsiya parametridan foydalanib, "hisoblash" deyish bilan rekursiyaga o'tkazish mumkin nth muddat (nth qisman sum) ".
Ma'lumotlarning rekursiv turlari.
Ko'pchilik kompyuter dasturlari o'zboshimchalik bilan katta miqdordagi ishlov berish yoki ishlab chiqarishi kerak ma'lumotlar. Rekursiya - aniq o'lchamlari noma'lum bo'lgan ma'lumotlarni aks ettirish usuli dasturchi: dasturchi ushbu ma'lumotni a bilan belgilashi mumkin o'z-o'ziga havola ta'rifi. O'z-o'ziga yo'naltirilgan ta'riflarning ikki turi mavjud: induktiv va koinduktiv ta'riflar.
Qo'shimcha ma'lumotlar: Algebraik ma'lumotlar turi
Induktiv ravishda aniqlangan ma'lumotlar
Asosiy maqola: Rekursiv ma'lumotlar turi
Ma'lumotlarning induktiv ravishda aniqlangan rekursiv ta'rifi - bu ma'lumotlarning misollarini qanday tuzishni belgilaydigan tushuncha. Masalan, bog'langan ro'yxatlar induktiv ravishda belgilanishi mumkin (bu erda, yordamida Xaskell sintaksis): ma'lumotlar ListOfStrings = EmptyList | Kamchiliklari Ip ListOfStrings Yuqoridagi kod bo'sh bo'lgan satrlar ro'yxatini yoki satr va qatorlar ro'yxatini o'z ichiga olgan tuzilmani belgilaydi. Ta'rifdagi o'z-o'ziga mos yozuvlar har qanday (cheklangan) sonli qatorlarning ro'yxatlarini tuzishga imkon beradi.
Induktivning yana bir misoli ta'rifi bo'ladi natural sonlar (yoki ijobiy butun sonlar ):Natural son yo 1 yoki n + 1, bu erda n natural son.
Xuddi shunday rekursiv ta'riflar ning tuzilishini modellashtirish uchun ko'pincha ishlatiladi iboralar va bayonotlar dasturlash tillarida. Til dizaynerlari ko'pincha sintaksisdagi grammatikalarni ifoda etadilar Backus-Naur shakli; Ko'paytirish va qo'shish bilan oddiy arifmetik iboralar tili uchun mana shunday grammatika:
::= |( * )|( + )
Bu shuni anglatadiki, ifoda - bu raqam, ikkita ifodaning hosilasi yoki ikkita ifodaning yig'indisi. Ikkinchi va uchinchi qatorlardagi ifodalarga rekursiv ravishda murojaat qilib, grammatika o'zboshimchalik bilan murakkab arifmetik ifodalarga ruxsat beradi. (5 * ((3 * 6) + 8)), bitta ifodada bir nechta mahsulot yoki sum operatsiyasi bilan.
|