Рекурсияның заманауи түсінігі: функционалдылықты анықтау және оған сырттан және осы функционалдық мүмкіндіктен қол жеткізу. Рекурсияны математиктер туды деп есептейді: факторлық есептеу, шексіз қатар, фракталдар, жалғасты бөлшектер… Алайда рекурсияны барлық жерде кездестіруге болады. Объективті табиғи заңдар рекурсияны өзінің негізгі алгоритмі және білдіру (болмыс) нысаны ретінде материалдық дүниенің көптеген объектілері емес, жалпы қозғалыстың негізгі алгоритмі ретінде «қарайды».
Ғылым мен техниканың әртүрлі салаларындағы әртүрлі мамандық иелері f (x) рекурсивті алгоритмін пайдаланады, мұндағы "x ~/=f (x)". Өзін шақыратын функция күшті шешім болып табылады, бірақ бұл шешімді қалыптастыру және түсіну көп жағдайда өте қиын тапсырма.
Ежелгі заманда сарай кеңістігін ұлғайту үшін рекурсия қолданылған. Бір-біріне бағытталған айналар жүйесі арқылы керемет үш өлшемді кеңістік әсерлерін жасауға болады. Бірақ қалай екенін түсіну оңай маосы айналарды реттейсіз бе? Бірнеше айна арқылы шағылған кеңістіктегі нүктенің қай жерде екенін анықтау қиынырақ.
Рекурсия, рекурсивті алгоритмдер: мағынасы және синтаксисі
Әрекеттер тізбегін қайталау арқылы тұжырымдалған мәселені рекурсивті түрде шешуге болады. Қарапайым алгоритм (квадрат теңдеуді есептеу, веб-бетті ақпаратпен толтыру үшін сценарий, файлды оқу, хабарлама жіберу…) рекурсияны қажет етпейді.
Рекурсивті шешімге мүмкіндік беретін алгоритмнің негізгі айырмашылықтары:
- бірнеше рет орындалуы керек алгоритм бар;
- алгоритмге әр уақытта өзгеретін деректер қажет;
- алгоритмді әр уақытта өзгерту қажет емес;
- соңғы шарт бар: алгоритм рекурсивті - шексіз емес.
Жалпы, бір реттік орындау рекурсия себебінің болмауының қажетті шарты болып табылады деп дау айтуға болмайды. Сондай-ақ міндетті соңғы шартты талап ете алмайсыз: шексіз рекурсиялардың өз ауқымы бар.
Алгоритм рекурсивті: әрекеттер тізбегі қайталанып орындалғанда, әр уақытта өзгеретін және әр уақытта жаңа нәтиже беретін деректерде.
Рекурсия формуласы
Рекурсияның және оның бағдарламалаудағы аналогының математикалық түсінігі әртүрлі. Математика, бағдарламалаудың белгілері бар болса да, бірақ бағдарламалау әлдеқайда жоғары дәрежелі математика.
Жақсы жазылған алгоритм өз авторының интеллектінің айнасы іспетті. Жалпыбағдарламалаудағы рекурсия формуласы "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() рекурсивті функциясы В() функциясын шақырады, ол бірдеңе жасайды және A() шақырады, онда бірден басқаруды қайтару мәселесі туындайды. Рекурсивті шақыруды аяқтағаннан кейін, A() функциясы оны қайта шақыратын B() функциясын қайта шақыру үшін басқаруды қабылдауы керек. Басқаруды стекте ретімен B() күйіне қайтару дұрыс емес шешім.
Бағдарламашы параметрлерді таңдауда шектелмейді және оларды функция атауларымен толықтыра алады. Басқаша айтқанда, идеалды шешім B() атауын A()-ға беру және A()-ның өзі B() деп атауға мүмкіндік береді. Бұл жағдайда басқаруды қайтаруда проблемалар болмайды және рекурсивті алгоритмнің орындалуы ашық болады.
Түсіну және рекурсия деңгейі
Рекурсивті алгоритмдерді әзірлеу мәселесі - процестің динамикасын түсіну қажет. Рекурсияны объектілік әдістерде, әсіресе абстрактілі ата-баба деңгейінде пайдаланған кезде, оның орындалу уақыты контекстінде өзіңіздің алгоритміңізді түсіну мәселесі туындайды.
Қазіргі уақытта шақыру механизмдерінде функциялардың кірістірілген деңгейіне және стек сыйымдылығына шектеулер жоқ, бірақ түсіну мәселесі бар: уақыттың қай нүктесінде қай деректер деңгейі немесе жалпы алгоритмдегі қай орын рекурсивті деп аталады функциясы және ол қанша қоңырау шалып жатқаны.
Қолданыстағы жөндеу құралдары жиі қуатсызбағдарламашыға дұрыс шешімді айт.
Циклдер және рекурсия
Циклдік орындау рекурсияға баламалы деп есептеледі. Шынында да, кейбір жағдайларда рекурсивті алгоритмді шартты және циклдік құрылымдардың синтаксисінде жүзеге асыруға болады.
Алайда, егер белгілі бір функция рекурсивті алгоритм арқылы жүзеге асырылуы керек екендігі туралы нақты түсінік болса, циклді немесе шартты мәлімдемелерді кез келген сыртқы пайдаланудан бас тарту керек.
Мұндағы мағына функция түріндегі рекурсивті шешімнің өзін пайдаланатын толық, функционалдық толық алгоритм болатынын білдіреді. Бұл алгоритм бағдарламашыдан алгоритм динамикасын түсіне отырып, оны күш салып жасауды талап етеді, бірақ бұл сыртқы бақылауды қажет етпейтін соңғы шешім болады.
Сыртқы шартты және циклдік операторлардың кез келген комбинациясы рекурсивті алгоритмді толық функция ретінде көрсетуге мүмкіндік бермейді.
Рекурсиялық консенсус және OOP
Рекурсивті алгоритмді құрудың барлық дерлік нұсқаларында екі алгоритмді әзірлеу жоспары туындайды. Бірінші алгоритм болашақ нысандардың (даналар) тізімін жасайды, ал екінші алгоритм шын мәнінде рекурсивті функция болып табылады.
Ең жақсы шешім рекурсияны нақты рекурсивті алгоритмді қамтитын жалғыз сипат (әдіс) ретінде ұйымдастыру және барлық дайындық жұмыстарын нысан конструкторына қою болады.
Рекурсивті алгоритм жұмыс істегенде ғана дұрыс шешім боладытек өз бетінше, сыртқы бақылаусыз және басқарусыз. Сыртқы алгоритм тек жұмысқа сигнал бере алады. Бұл жұмыстың нәтижесі сыртқы қолдаусыз күтілетін шешім болуы керек.
Рекурсия әрқашан толық дербес шешім болуы керек.
Интуитивті түсіну және функционалдық толықтық
Объектіге бағытталған бағдарламалау іс жүзінде стандартқа айналғанда, тиімді кодтау үшін өз ойыңызды өзгерту керек екені белгілі болды. Алгоритмді орындау барысында бағдарламашы тілдің синтаксисі мен семантикасынан семантика динамикасына өтуі керек.
Рекурсияның сипаттамасы: оны барлығына қолдануға болады:
- веб скрепинг;
- іздеу операциялары;
- мәтіндік ақпаратты талдау;
- MS Word құжаттарын оқу немесе жасау;
- тегтерді іріктеу немесе талдау…
OOP сипаттамасы: ол абстрактілі ата-баба деңгейінде рекурсивті алгоритмді сипаттауға мүмкіндік береді, бірақ оның әрқайсысында деректер мен қасиеттердің өз палитрасы бар бірегей ұрпақтарға сілтеме жасауды қамтамасыз етеді.
Рекурсия өте қолайлы, себебі ол алгоритмнің функционалдық толықтығын талап етеді. OOP барлық бірегей еншілестерге рұқсат беру арқылы рекурсивті алгоритмнің өнімділігін жақсартады.