Рекурсивдүү алгоритм: сүрөттөмө, талдоо, өзгөчөлүктөр жана мисалдар

Мазмуну:

Рекурсивдүү алгоритм: сүрөттөмө, талдоо, өзгөчөлүктөр жана мисалдар
Рекурсивдүү алгоритм: сүрөттөмө, талдоо, өзгөчөлүктөр жана мисалдар
Anonim

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

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

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

Байыркы убакта сарайдын аянтын көбөйтүү үчүн рекурсия колдонулган. Бири-бирине багытталган күзгүлөр системасы аркылуу сиз укмуштуудай үч өлчөмдүү мейкиндик эффекттерин түзө аласыз. Бирок кантип түшүнүү ушунчалык оңойбубул күзгүлөрдү тууралообу? Бир нече күзгү аркылуу чагылдырылган мейкиндиктеги чекиттин кайда экенин аныктоо андан да кыйын.

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

Амалдардын ырааттуулугун кайталоо менен түзүлгөн маселе рекурсивдүү түрдө чечилет. Жөнөкөй алгоритм (квадраттык теңдемени эсептөө, веб-баракты маалымат менен толтуруу үчүн скрипт, файлды окуу, билдирүү жөнөтүү…) рекурсияны талап кылбайт.

Алгоритмдин рекурсивдүү чечүүгө мүмкүндүк берген негизги айырмачылыктары:

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

Жалпысынан алганда, бир жолку аткаруу рекурсия үчүн себептин жоктугунун зарыл шарты деп айтууга болбойт. Ошондой эле милдеттүү акыркы шартты талап кыла албайсыз: чексиз рекурсиялардын өзүнүн масштабы бар.

Алгоритм рекурсивдүү: операциялардын ырааттуулугу кайра-кайра аткарылганда, ар бир жолу өзгөргөн жана ар бир жолу жаңы натыйжа берген маалыматтарда.

Рекурсиянын формуласы

Рекурсиянын жана анын программалоодогу аналогунун математикалык түшүнүгү ар түрдүү. Математика, программалоонун белгилери бар болсо да, бирок программалоо - бул алда канча жогору даражадагы математика.

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

Жакшы жазылган алгоритм анын авторунун интеллектинин күзгүсү сыяктуу. Генералпрограммалоодо рекурсия формуласы "f(x)", мында "x ~/=f(x)" жок дегенде эки чечмелөөгө ээ. Бул жерде "~" натыйжанын окшоштугу же жоктугу, ал эми "=" - функциянын натыйжасынын болушу.

Биринчи параметр: маалымат динамикасы.

  • функция "f(x)" рекурсивдүү жана өзгөрүлгүс алгоритмге ээ;
  • "x" жана "f(x)" натыйжасы ар бир жолу жаңы маанилерге ээ, "f(x)" натыйжасы бул функциянын жаңы "x" параметри.

Экинчи вариант: код динамикасы.

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

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

Дайындар жана рекурсия

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

Факториялык "8!" Кандай мааниге ээ эмес,бул формуланы так аткарган алгоритм.

Маалыматты иштетүү - бул таптакыр башка тартиптеги "математика". Бул жерде рекурсивдүү функциялар жана алгоритмдер тамгалар, сөздөр, сөз айкаштары, сүйлөмдөр жана абзацтар боюнча иштейт. Ар бир кийинки деңгээл мурункуну колдонот.

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

Абстракция, рекурсия жана OOP

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

Мисалы, маалымат талданууда жана тамгалар, сөздөр, сөз айкаштары, сүйлөмдөр жана абзацтар өзүнчө бөлүп көрсөтүлөт. Албетте, иштеп чыгуучу бул беш типтеги объекттердин инстанцияларын түзүүнү камсыздайт жана ар бир деңгээлде рекурсивдүү алгоритмдердин чечимин сунуштайт.

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

Ал эми тамгалардын деңгээлинде “мааниси издөөнүн кереги жок” болсо, анда сөз деңгээлинде семантика пайда болот. Сөздөрдү этиштерге, зат атоочторго, тактоочторго, предлогдорго бөлсөңүз болот… Андан ары барып, учурларды аныктасаңыз болот.

Фразалар деңгээлинде семантика тыныш белгилери жана логика менен толукталатсөз айкалышы. Сүйлөмдөрдүн деңгээлинде семантиканын дагы кемчиликсиз деңгээли табылып, абзацты толук ой катары кароого болот.

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

Алгоритмдин басымдуу бөлүгү абстракттуу ата-бабалардын деңгээлинде түзүлүп, аны ар бир тукумдун деңгээлинде абстрактуу деңгээлден чакырылган маалыматтар жана ыкмалар менен тактоо маанилүү. Бул контекстте абстракция рекурсия үчүн жаңы горизонтторду ачат.

ООПтун тарыхый өзгөчөлүктөрү

OOP программалык камсыздоо дүйнөсүнө эки жолу келди, бирок кээ бир эксперттер булуттагы эсептөөлөрдүн пайда болушун жана объекттер жана класстар жөнүндө заманбап идеяларды IT-технологияларды өнүктүрүүнүн жаңы айлампасы катары белгилеши мүмкүн.

ООПтун заманбап контекстиндеги "объект" жана "объект" терминдери адатта өткөн кылымдын 50-60-жылдарына таандык, бирок алар 1965-жылга жана Simula, Lisp, Algol, Smalltalk пайда болушу менен байланышкан..

Ал убакта программалоо өзгөчө өнүккөн эмес жана революциялык концепцияларга адекваттуу жооп бере алган эмес. Идеялардын жана программалоо стилдеринин күрөшү (C/C++ жана Pascal – негизинен) али алыс болчу жана маалымат базалары дагы эле концептуалдык түрдө калыптанган.

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

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

Албетте, мурда рекурсивдүү алгоритмдер жөн гана программанын жалпы кодунда колдонулган функциялар болсо, азыр рекурсия объекттин (класстын) касиеттеринин бир бөлүгү болуп калышы мүмкүн, бул мурас контекстинде кызыктуу мүмкүнчүлүктөрдү берген.

Заманбап OOP өзгөчөлүгү

ООПтун өнүгүшү алгач объекттерди (класстарды) маалыматтардын жана касиеттеринин (ыкмаларынын) жыйнагы катары жарыялаган. Чынында, бул синтаксиси жана мааниси бар маалыматтар жөнүндө болгон. Бирок анда чыныгы объекттерди башкаруу куралы катары OOP көрсөтүү мүмкүн болгон жок.

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

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

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

Стектер жана функцияларды чакыруу механизмдери

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

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

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

Рекурсивдүү алгоритмдер түшүнүгү, алардын аттары жана денелери тапшырманы түзүү учурунда (кааланган алгоритмди тандоо) аныкталышы мүмкүн болгондо, рекурсивдүүлүктү бир нерсени кантип жасоону гана эмес, ошондой эле ким так аткарышы керек экенин да кеңейтет. кыл муну. Алгоритмди "маанилүү" аталышы боюнча тандоо келечектүү, бирок кыйынчылыктарды жаратат.

Функциялардын топтомундагы рекурсивдүүлүк

Алгоритм өзүн чакырганда, ал рекурсивдүү деп айта албайсыз. Программалоо догма эмес жана рекурсивдүүлүк түшүнүгү өзүңүздүн алгоритмиңиздин денесинен өзүңүздү чакыруу үчүн өзгөчө талап эмес.

Практикалык колдонмолор дайыма эле таза чечим бере бербейт. Көбүнчө, баштапкы маалыматтар даярдалышы керек жана рекурсивдүү чакыруунун натыйжасы бүт маселенин (бүт алгоритм) контекстинде талданышы керек.жалпы.

Чынында, рекурсивдүү функция чакырылганга чейин эле эмес, ал аяктагандан кийин дагы башка программаны чакырса болот же чакырылышы керек. Чакырууда өзгөчө көйгөйлөр жок болсо: рекурсивдүү A() функциясы B() функциясын чакырат, ал бир нерсе кылат жана A() деп чакырат, анда дароо башкарууну кайтарып алуу маселеси келип чыгат. Рекурсивдүү чакырууну аяктагандан кийин, A() функциясы B()ди кайра чакыруу үчүн башкарууну кабыл алышы керек, ал аны кайра чакырат. Көзөмөлдү стекке ирети менен кайра B() га кайтаруу туура эмес чечим.

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

Түшүнүү жана рекурсиянын деңгээли

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

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

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

Учурдагы мүчүлүштүктөрдү оңдоо куралдары көбүнчө кубатсызпрограммистке туура чечимди айт.

Циклдер жана рекурсия

Циклдик аткаруу рекурсияга эквиваленттүү деп эсептелет. Чынында эле, кээ бир учурларда, рекурсивдүү алгоритм шарттуу жана циклдик түзүлүштөрдүн синтаксисинде ишке ашырылышы мүмкүн.

Бирок, белгилүү бир функция рекурсивдүү алгоритм аркылуу ишке ашырылышы керек деген так түшүнүк бар болсо, циклди же шарттуу билдирүүлөрдү тышкы колдонуудан баш тартуу керек.

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

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

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

Рекурсиялык консенсус жана OOP

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

Эң жакшы чечим рекурсияны рекурсивдүү алгоритмди камтыган бирдиктүү касиет (ыкма) катары уюштуруу жана бардык даярдык иштерин объект конструкторуна коюу болуп саналат.

Рекурсивдүү алгоритм иштегенде гана туура чечим болоттышкы көзөмөлсүз жана башкаруусуз, өзү гана. Тышкы алгоритм иш үчүн сигнал гана бере алат. Бул иштин натыйжасы тышкы колдоосуз эле күтүлгөн чечим болушу керек.

Рекурсия ар дайым толук өз алдынча чечим болушу керек.

Интуитивдик түшүнүү жана функционалдык толуктук

Объектке багытталган программалоо де-факто стандартка айланганда, эффективдүү коддоо үчүн өзүңүздүн ой жүгүртүүңүздү өзгөртүү керек экени айкын болду. Алгоритмди аткарууда программист тилдин синтаксиси менен семантикасынан семантикасынын динамикасына өтүшү керек.

Рекурсиянын өзгөчөлүгү: аны баарына колдонсо болот:

  • желе кыргыч;
  • издөө операциялары;
  • текст маалыматын талдоо;
  • MS Word документтерин окуу же түзүү;
  • тегдерди тандап алуу же талдоо…

ООПтун мүнөздөмөсү: ал абстрактуу түпкү атанын деңгээлинде рекурсивдүү алгоритмди сүрөттөөгө мүмкүндүк берет, бирок анын ар биринин өзүнүн маалыматтар палитрасы жана касиеттери бар уникалдуу урпактарга кайрылуусун камсыздайт.

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

Рекурсия идеалдуу, анткени ал алгоритминин функционалдык толуктугун талап кылат. OOP бардык уникалдуу балдарга мүмкүнчүлүк берип, рекурсивдүү алгоритмдин иштешин жакшыртат.

Сунушталууда: