Рекурсив алгоритм: тайлбар, дүн шинжилгээ, онцлог, жишээ

Агуулгын хүснэгт:

Рекурсив алгоритм: тайлбар, дүн шинжилгээ, онцлог, жишээ
Рекурсив алгоритм: тайлбар, дүн шинжилгээ, онцлог, жишээ
Anonim

Рекурсын тухай орчин үеийн ойлголт: функциональ байдлын тодорхойлолт, түүнд гаднаас болон энэ функцээс хандах хандалт. Рекурсийг математикчид төрсөн гэж үздэг: хүчин зүйлийн тооцоо, хязгааргүй цуваа, фрактал, үргэлжилсэн бутархай … Гэсэн хэдий ч рекурсийг хаа сайгүй олж болно. Объектив байгалийн хуулиуд рекурсийг үндсэн алгоритм, илэрхийлэх хэлбэр (оршихуй) гэж материаллаг ертөнцийн ихэнх объектууд биш, харин ерөнхийдөө хөдөлгөөний үндсэн алгоритм гэж "үздэг".

рекурсив алгоритм
рекурсив алгоритм

Шинжлэх ухаан, технологийн янз бүрийн чиглэлээр мэргэшсэн хүмүүс f (x) рекурсив алгоритмыг ашигладаг бөгөөд "x ~/=f (x)". Өөрийгөө дууддаг функц нь хүчтэй шийдэл боловч энэ шийдлийг бий болгож, ойлгох нь ихэнх тохиолдолд маш хэцүү ажил юм.

Эрт дээр үед ордны орон зайг нэмэгдүүлэхийн тулд рекурсийг ашигладаг байсан. Бие бие рүүгээ чиглэсэн тольны системээр дамжуулан та гайхалтай гурван хэмжээст орон зайн эффектүүдийг бий болгож чадна. Гэхдээ яаж гэдгийг ойлгоход тийм амархан гэж үүЭдгээр толийг тохируулах уу? Хэд хэдэн толинд туссан сансар огторгуйн цэг хаана байгааг тодорхойлох нь бүр ч хэцүү.

Рекурс, рекурсив алгоритмууд: утга ба синтакс

Үйлдлийн дарааллыг давтах замаар томъёолсон асуудлыг рекурсив аргаар шийдэж болно. Энгийн алгоритм (квадрат тэгшитгэлийг тооцоолох, вэб хуудсыг мэдээллээр дүүргэх скрипт, файл унших, мессеж илгээх…) нь рекурс хийх шаардлагагүй.

Рекурсив шийдлийг зөвшөөрдөг алгоритмын гол ялгаа:

  • хэд хэдэн удаа гүйцэтгэх шаардлагатай алгоритм байна;
  • алгоритмд цаг тутамд өөрчлөгддөг өгөгдөл шаардлагатай;
  • алгоритмыг тэр болгон өөрчлөх шаардлагагүй;
  • эцсийн нөхцөл бий: алгоритм нь рекурсив - хязгааргүй биш.

Ер нь нэг удаагийн гүйцэтгэл нь рекурс хийх шалтгаан байхгүй байх зайлшгүй нөхцөл гэдэгтэй маргах аргагүй. Та мөн заавал эцсийн нөхцөл шаардах боломжгүй: хязгааргүй рекурсууд өөрийн гэсэн хамрах хүрээтэй.

Алгоритм нь рекурсив байна: өгөгдлүүд дээр дараалсан үйлдлүүдийг удаа дараа гүйцэтгэх үед, тухай бүрд өөрчлөгдөж, шинэ үр дүн өгдөг.

Recursion томъёо

Рекурс ба түүний аналогийн програмчлалын математикийн ойлголт өөр. Математик нь хэдийгээр програмчлалын шинж тэмдэг байдаг ч програмчлал нь илүү өндөр түвшний математик юм.

рекурсив алгоритм f
рекурсив алгоритм f

Сайн бичсэн алгоритм нь зохиогчийнхоо оюуны толь мэт. ГенералПрограмчлалын рекурсын томъёо нь "f(x)" бөгөөд "x ~/=f(x)" нь дор хаяж хоёр тайлбартай байдаг. Энд "~" нь үр дүнгийн ижил төстэй эсвэл байхгүй, "=" нь функцийн үр дүн байгаа эсэхийг илэрхийлнэ.

Эхний сонголт: өгөгдлийн динамик.

  • "f(x)" функц нь рекурсив ба хувиршгүй алгоритмтай;
  • "x" ба "f(x)" үр дүн нь бүрт шинэ утгатай байх ба "f(x)" үр дүн нь энэ функцийн шинэ "x" параметр юм.

Хоёр дахь сонголт: кодын динамик.

  • "f(x)" функц нь өгөгдлийг боловсронгуй болгох (шинжилгээ хийх) хэд хэдэн алгоритмтай;
  • өгөгдлийн шинжилгээ - кодын нэг хэсэг ба хүссэн үйлдлийг гүйцэтгэх рекурсив алгоритмуудын хэрэгжилт - кодын хоёр дахь хэсэг;
  • "f(x)" функцийн үр дүн биш байна.

Хэвийн үр дүн байхгүй. Програмчлал бол математик биш, энд үр дүн нь тодорхой байх албагүй. Рекурсив функц нь зүгээр л сайтуудыг задлан өгөгдлийн санг дүүргэх эсвэл ирж буй оролтын дагуу объектуудыг үүсгэж болно.

Өгөгдөл ба рекурс

Рекурсив алгоритмуудыг програмчлах нь нэгээс их эсвэл нэгээс бага өгөгдсөн утгыг функц хүлээн авах бүрт хүчин зүйл тооцох тухай биш бөгөөд хэрэгжүүлэх сонголт нь хөгжүүлэгчийн сонголтоос хамаарна.

"8!" гэсэн хүчин зүйл нь хамаагүй,Энэ томьёог нарийн дагадаг алгоритм.

Мэдээллийг боловсруулах нь огт өөр дарааллын "математик" юм. Энд байгаа рекурсив функц, алгоритмууд нь үсэг, үг, хэллэг, өгүүлбэр, догол мөр дээр ажилладаг. Дараагийн түвшин бүр өмнөхийг ашигладаг.

Оролтын өгөгдлийн урсгалыг өргөн хүрээний нөхцөлд шинжилдэг боловч шинжилгээний процесс нь ерөнхийдөө рекурсив байдаг. Оролтын урсгалын бүх хувилбарт өвөрмөц алгоритм бичих нь утгагүй юм. Нэг функц байх ёстой. Энд рекурсив алгоритмууд нь оролтод тохирох гаралтын урсгалыг хэрхэн бүрдүүлэх жишээ юм. Энэ нь рекурсив алгоритмын гаралт биш боловч хүссэн бөгөөд шаардлагатай шийдэл юм.

Хийсвэрлэл, рекурс ба OOP

Объект хандалтат програмчлал (OOP) болон рекурс нь үндсэндээ өөр объектууд боловч тэдгээр нь бие биенээ төгс нөхдөг. Хийсвэрлэл нь рекурстай ямар ч холбоогүй боловч OOP-ийн линзээр дамжуулан контекст рекурсийг хэрэгжүүлэх боломжийг бий болгодог.

Жишээ нь, мэдээллийг задлан шинжилж, үсэг, үг, хэллэг, өгүүлбэр, догол мөрийг тусад нь тодруулж байна. Мэдээжийн хэрэг, хөгжүүлэгч эдгээр таван төрлийн объектын тохиолдлуудыг бий болгож, түвшин бүрт рекурсив алгоритмуудын шийдлийг санал болгоно.

рекурсив алгоритмуудыг програмчлах
рекурсив алгоритмуудыг програмчлах

Энэ хооронд "утга хайх нь утгагүй" үсгийн түвшинд байвал үгийн түвшинд семантик гарч ирдэг. Та үгсийг үйл үг, нэр үг, үйл үг, угтвар үг гэж хувааж болно… Та цаашаа явж, тохиолдлуудыг тодорхойлж болно.

Өгүүлбэрийн түвшинд семантикийг цэг таслал, логикоор нөхдөг.үгийн хослолууд. Өгүүлбэрийн түвшинд утга зүйн илүү төгс түвшин олддог бөгөөд догол мөрийг бүрэн санаа гэж үзэж болно.

Объект хандлагат хөгжил нь шинж чанар, аргын удамшлыг урьдчилан тодорхойлж, объектын шатлалыг бүрэн хийсвэр өвөг үүсгэх замаар эхлүүлэхийг санал болгодог. Үүний зэрэгцээ, үр удам бүрийн шинжилгээ нь рекурсив байх бөгөөд техникийн түвшинд олон байрлалд (үсэг, үг, хэллэг, өгүүлбэр) хэт их ялгаатай байх нь эргэлзээгүй. Бүрэн бодлууд шиг догол мөр нь энэ жагсаалтаас ялгарч болох ч мөн чанар нь биш юм.

Алгоритмын дийлэнх хэсгийг хийсвэр өвөг дээдсийн түвшинд боловсруулж, хийсвэр түвшингээс дуудагдсан өгөгдөл, аргуудаар үр удам бүрийн түвшинд боловсронгуй болгох нь чухал юм. Энэ хүрээнд хийсвэрлэл нь рекурс хийх шинэ боломжуудыг нээж өгдөг.

OOP-н түүхэн онцлог

OOP нь програм хангамжийн ертөнцөд хоёр удаа орж ирсэн боловч зарим мэргэжилтнүүд үүлэн тооцоолол болон объект, ангиудын талаарх орчин үеийн санааг IT технологийн хөгжлийн шинэ үе гэж онцолж магадгүй юм.

OOP-ийн орчин үеийн нөхцөл дэх "объект" ба "зорилго" гэсэн нэр томъёог ихэвчлэн өнгөрсөн зууны 50-60-аад онуудад хамааруулдаг боловч 1965 он болон Simula, Lisp, Algol, Smalltalk гарч ирсэнтэй холбоотой..

Тэр үед програмчлал тийм ч сайн хөгжөөгүй байсан бөгөөд хувьсгалт үзэл баримтлалд хангалттай хариу үйлдэл үзүүлж чадахгүй байв. Үзэл санаа, програмчлалын хэв маягийн тэмцэл (C / C ++ болон Pascal - ихэвчлэн) хол байсан бөгөөд мэдээллийн сан нь үзэл баримтлалын хувьд бүрдсэн хэвээр байв.

рекурсын рекурсив алгоритмууд
рекурсын рекурсив алгоритмууд

80-аад оны сүүл, 90-ээд оны эхээр объектууд Паскаль хэл дээр гарч ирсэн бөгөөд бүгд C / C ++ хэл дээрх хичээлүүдийг санаж байсан - энэ нь OOP-ийн сонирхлын шинэ үеийг тэмдэглэсэн бөгөөд тэр үед хэрэглүүрүүд, ялангуяа програмчлалын хэлүүд тийм ч чухал биш болсон. зөвхөн объект хандалтат санааг дэмжих боловч үүний дагуу хувьсан өөрчлөгдөнө.

Мэдээжийн хэрэг, хэрэв өмнөх рекурсив алгоритмууд нь зөвхөн программын ерөнхий кодонд ашиглагдаж байсан функцууд байсан бол одоо рекурс нь объектын (ангиллын) шинж чанаруудын нэг хэсэг болж, удамшлын нөхцөлд сонирхолтой боломжуудыг олгосон.

Орчин үеийн OOP-ийн онцлог

OOP-ийн хөгжүүлэлт нь эхлээд объектуудыг (ангилуудыг) өгөгдөл, шинж чанаруудын (арга) цуглуулга гэж зарласан. Үнэн хэрэгтээ энэ нь синтакс, утгатай өгөгдлийн тухай байсан. Гэвч дараа нь OOP-ийг бодит объектыг удирдах хэрэгсэл болгон харуулах боломжгүй байсан.

рекурсив функц ба алгоритмууд
рекурсив функц ба алгоритмууд

OOP нь "компьютерийн шинж чанартай" объектуудыг удирдах хэрэгсэл болсон. Скрипт, товчлуур, цэсийн зүйл, цэсийн мөр, хөтчийн цонхны шошго нь объект юм. Гэхдээ машин, хүнсний бүтээгдэхүүн, үг, өгүүлбэр биш. Бодит объектууд объект хандалтат програмчлалаас гадуур үлдэж, компьютерийн хэрэгслүүд шинэ дүр төрхтэй болсон.

Алдартай програмчлалын хэлнүүдийн ялгаатай байдлаас шалтгаалан OOP-ийн олон аялгуу бий болсон. Семантикийн хувьд тэдгээр нь практикт ижил төстэй бөгөөд хэрэглээний талбарт бус харин багажийн талбарт анхаарлаа төвлөрүүлж байгаа нь бодит объектын тайлбарыг илүү нарийвчлан авч үзэх боломжийг олгодог.алгоритмууд болон тэдгээрийн платформ болон хэл хоорондын "оршихуй" байдлыг баталгаажуулна.

Стек ба функц дуудлагын механизм

Функцуудыг (процедур, алгоритм) дуудах механизм нь өгөгдөл (параметр) дамжуулах, үр дүнг буцаах, функц (процедур) дууссаны дараа хяналтыг хүлээн авах операторын хаягийг санахыг шаарддаг.

рекурсив алгоритмын жишээ
рекурсив алгоритмын жишээ

Ихэвчлэн энэ зорилгоор стекийг ашигладаг боловч програмчлалын хэл эсвэл хөгжүүлэгч өөрөө хяналтыг шилжүүлэх олон янзын сонголтыг санал болгодог. Орчин үеийн програмчлал нь функцийн нэр нь зөвхөн параметр биш байж болно гэдгийг хүлээн зөвшөөрдөг: энэ нь алгоритмыг гүйцэтгэх явцад үүсч болно. Алгоритмыг өөр алгоритмыг гүйцэтгэх явцад үүсгэж болно.

Даалгаврыг бий болгох үед (хүссэн алгоритмаа сонгох) нэр, биеийг нь тодорхойлох боломжтой рекурсив алгоритмын тухай ойлголт нь рекурсив байдлыг зөвхөн ямар нэг зүйлийг хэрхэн хийх төдийгүй, яг хэн хийх ёстойг хамардаг. үүнийг хий. Алгоритмыг "утга утгатай" нэрээр нь сонгох нь ирээдүйтэй ч хүндрэл үүсгэдэг.

Функцийн багц дээрх рекурсив

Алгоритм өөрийгөө дуудаж байхад л рекурсив гэж хэлж болохгүй. Програмчлал нь догма биш бөгөөд рекурсив байдлын тухай ойлголт нь өөрийн алгоритмын үндсэн хэсгээс өөрийгөө дуудах онцгой шаардлага биш юм.

Практик хэрэглүүрүүд үргэлж цэвэр шийдэл өгдөггүй. Ихэнхдээ анхны өгөгдлийг бэлтгэх шаардлагатай бөгөөд рекурсив дуудлагын үр дүнг бүх асуудлын хүрээнд (бүх алгоритм) дүн шинжилгээ хийх шаардлагатай.ерөнхийдөө.

Үнэндээ зөвхөн рекурсив функц дуудагдахаас өмнө төдийгүй түүнийг дуусгасны дараа өөр програм дуудаж болно эсвэл дуудах ёстой. Хэрэв дуудлагад ямар нэгэн онцгой асуудал гараагүй бол: рекурсив функц A() нь ямар нэг зүйл хийдэг B() функцийг дуудаж, A() гэж дууддаг бол тэр даруй хяналтыг буцаахад асуудал гарна. Рекурсив дуудлагыг дуусгасны дараа A() функц B()-г дахин дуудахын тулд хяналтыг хүлээн авах ёстой бөгөөд энэ нь түүнийг дахин дуудах болно. Удирдлагыг сттек дээрх дарааллаар нь буцааж B() руу буцаах нь буруу шийдэл юм.

Програмист параметрийн сонголтоор хязгаарлагдахгүй бөгөөд тэдгээрийг функцийн нэрээр гүйцээж болно. Өөрөөр хэлбэл, хамгийн тохиромжтой шийдэл нь B()-ийн нэрийг A() руу дамжуулж, A() өөрөө B() гэж дуудуулах явдал юм. Энэ тохиолдолд хяналтыг буцаахад ямар ч асуудал гарахгүй бөгөөд рекурсив алгоритмын хэрэгжилт илүү ил тод байх болно.

Рекурсын ойлголт ба түвшин

Рекурсив алгоритм боловсруулахтай холбоотой асуудал бол процессын динамикийг ойлгох хэрэгтэй. Объектын аргуудад, ялангуяа хийсвэр өвөг дээдсийн түвшинд рекурсийг ашиглах үед өөрийн алгоритмыг түүний гүйцэтгэх хугацааны хүрээнд ойлгоход асуудал гардаг.

рекурсив алгоритмуудыг шийдвэрлэх
рекурсив алгоритмуудыг шийдвэрлэх

Одоогоор дуудлагын механизмд функцүүдийн үүрлэх түвшин болон стекийн багтаамжид ямар нэгэн хязгаарлалт байхгүй боловч ямар үед ямар өгөгдлийн түвшин эсвэл ерөнхий алгоритмын аль байрлалыг рекурсив гэж нэрлэдэгийг ойлгох асуудал байна. функц болон өөрийгөө хэдэн дууддаг вэ.

Одоо байгаа дибаг хийх хэрэгслүүд ихэвчлэн хүчгүй байдагПрограммист зөв шийдлийг хэлээрэй.

Гогцоо ба рекурс

Циклийн гүйцэтгэлийг рекурс хийхтэй тэнцүү гэж үздэг. Үнэн хэрэгтээ, зарим тохиолдолд рекурсив алгоритмыг нөхцөлт болон мөчлөгийн бүтцийн синтакс дээр хэрэгжүүлж болно.

Гэсэн хэдий ч, хэрэв тодорхой функцийг рекурсив алгоритмаар хэрэгжүүлэх ёстой гэсэн тодорхой ойлголт байгаа бол давталтын гадаад хэрэглээ эсвэл нөхцөлт мэдэгдлийг орхих хэрэгтэй.

рекурсив алгоритмын хэрэгжилт
рекурсив алгоритмын хэрэгжилт

Энд байгаа утга нь функц хэлбэрээр өөрийгөө ашигласан рекурсив шийдэл нь бүрэн гүйцэд, функциональ бүрэн алгоритм болно. Энэ алгоритм нь програмистаас алгоритмын динамикийг ойлгож хүчин чармайлт гаргаж үүнийг бүтээхийг шаардах боловч энэ нь гадны хяналт шаарддаггүй эцсийн шийдэл байх болно.

Гадаад нөхцөлт болон мөчлөгт операторуудын ямар ч хослол нь рекурсив алгоритмыг бүрэн функцээр илэрхийлэхийг зөвшөөрөхгүй.

Recursion Consensus ба OOP

Рекурсив алгоритм боловсруулах бараг бүх хувилбарт хоёр алгоритм боловсруулах төлөвлөгөө гарч ирдэг. Эхний алгоритм нь ирээдүйн объектуудын (нөхцөлүүдийн) жагсаалтыг үүсгэдэг бөгөөд хоёр дахь алгоритм нь үнэндээ рекурсив функц юм.

Хамгийн сайн шийдэл бол рекурсийг рекурсив алгоритмыг агуулсан ганц шинж чанар (арга) болгон зохион байгуулж, бүх бэлтгэл ажлыг объект бүтээгч рүү оруулах явдал юм.

Рекурсив алгоритм нь ажиллаж байх үед л зөв шийдэл байх болноГадны хяналт, удирдлагагүйгээр зөвхөн өөрөө. Гадны алгоритм нь зөвхөн ажиллах дохиог өгч чадна. Энэ ажлын үр дүн нь гадны дэмжлэггүйгээр хүлээгдэж буй шийдэл байх ёстой.

Recursion нь үргэлж бүрэн бие даасан шийдэл байх ёстой.

Зөн совингийн ойлголт ба үйл ажиллагааны бүрэн байдал

Объект хандалтат програмчлал нь де факто стандарт болсон үед үр дүнтэй кодлохын тулд та өөрийн сэтгэлгээгээ өөрчлөх хэрэгтэй болох нь тодорхой болсон. Программист алгоритмыг гүйцэтгэх явцад хэлний синтакс, семантикаас семантикийн динамик руу шилжих ёстой.

Рекурсын онцлог: үүнийг бүх зүйлд хэрэглэж болно:

  • вэб хусах;
  • хайх үйлдлүүд;
  • текст мэдээллийг задлан шинжилж байна;
  • MS Word баримт бичгийг унших эсвэл үүсгэх;
  • шошгуудыг түүвэрлэх эсвэл шинжлэх…

OOP-ийн онцлог: энэ нь хийсвэр өвөг дээдсийн түвшинд рекурсив алгоритмыг дүрслэх боломжийг олгодог боловч тус бүр өөрийн гэсэн өгөгдөл, шинж чанаруудтай өвөрмөц үр удамд хандах боломжийг олгодог.

рекурсив алгоритмын тухай ойлголт
рекурсив алгоритмын тухай ойлголт

Recursion нь алгоритмынхаа бүрэн бүтэн байдлыг шаарддаг тул хамгийн тохиромжтой. OOP нь рекурсив алгоритмд бүх өвөрмөц хүүхдүүдэд хандах боломжийг олгосноор түүний гүйцэтгэлийг сайжруулдаг.

Зөвлөмж болгож буй: