Rekurzivni algoritem: opis, analiza, značilnosti in primeri

Kazalo:

Rekurzivni algoritem: opis, analiza, značilnosti in primeri
Rekurzivni algoritem: opis, analiza, značilnosti in primeri
Anonim

Sodobno razumevanje rekurzije: definicija funkcionalnosti in dostop do nje od zunaj in iz te funkcionalnosti. Menijo, da so rekurzijo rodili matematiki: faktorski izračun, neskončne serije, fraktali, kontinuirani ulomki … Vendar pa je rekurzijo mogoče najti povsod. Objektivni naravni zakoni rekurzijo "razmišljajo" kot svoj glavni algoritem in obliko izražanja (obstoja) ne toliko predmetov materialnega sveta, ampak na splošno glavni algoritem gibanja.

rekurzivni algoritem
rekurzivni algoritem

Ljudje različnih specialnosti na različnih področjih znanosti in tehnologije uporabljajo rekurzivni algoritem f (x), kjer je "x ~/=f (x)". Funkcija, ki kliče samo sebe, je močna rešitev, vendar je oblikovanje in razumevanje te rešitve v večini primerov zelo težka naloga.

V starih časih je bila rekurzija uporabljena za povečanje prostora palače. S sistemom ogledal, usmerjenih drug proti drugemu, lahko ustvarite osupljive tridimenzionalne prostorske učinke. Toda ali je tako enostavno razumeti, kakoprilagoditi ta ogledala? Še težje je določiti, kje je točka v prostoru, ki se odraža skozi več ogledal.

Rekurzivni, rekurzivni algoritmi: pomen in sintaksa

Problem, ki je formuliran s ponavljanjem zaporedja operacij, je mogoče rešiti rekurzivno. Preprost algoritem (izračunavanje kvadratne enačbe, skripta za zapolnitev spletne strani z informacijami, branje datoteke, pošiljanje sporočila …) ne zahteva rekurzije.

Glavne razlike algoritma, ki omogoča rekurzivno rešitev:

  • obstaja algoritem, ki ga je treba večkrat izvesti;
  • algoritem potrebuje podatke, ki se vsakič spremenijo;
  • algoritma ni treba vsakič spreminjati;
  • obstaja končni pogoj: algoritem je rekurziven - ni neskončen.

Na splošno ni mogoče trditi, da je enkratna izvršitev nujen pogoj za odsotnost razloga za rekurzijo. Prav tako ne morete zahtevati obveznega končnega pogoja: neskončne rekurzije imajo svoj obseg.

Algoritem je rekurziven: ko se zaporedje operacij izvaja večkrat, na podatkih, ki se vsakič spremenijo in dajejo vsakič nov rezultat.

Rekurzijska formula

Matematično razumevanje rekurzije in njenega analoga v programiranju je različno. Matematika, čeprav obstajajo znaki programiranja, je programiranje matematika veliko višjega reda.

rekurzivni algoritem f
rekurzivni algoritem f

Dobro napisan algoritem je kot ogledalo intelekta svojega avtorja. Generalrekurzijska formula v programiranju je "f(x)", kjer ima "x ~/=f(x)" vsaj dve interpretaciji. Tukaj je "~" podobnost ali odsotnost rezultata, "=" pa prisotnost rezultata funkcije.

Prva možnost: dinamika podatkov.

  • funkcija "f(x)" ima rekurziven in nespremenljiv algoritem;
  • "x" in rezultat "f(x)" imata vsakič nove vrednosti, rezultat "f(x)" je nov parameter "x" te funkcije.

Druga možnost: dinamika kode.

  • funkcija "f(x)" ima več algoritmov, ki izboljšujejo (analizirajo) podatke;
  • analiza podatkov - en del kode in izvedba rekurzivnih algoritmov, ki izvedejo želeno dejanje - drugi del kode;
  • rezultat funkcije "f(x)" ni.

Noben rezultat ni normalen. Programiranje ni matematika, tukaj ni nujno, da je rezultat eksplicitno prisoten. Rekurzivna funkcija lahko preprosto razčleni mesta in zapolni bazo podatkov ali ustvari primere objektov glede na dohodni vnos.

Podatki in rekurzija

Pri programiranju rekurzivnih algoritmov ne gre za izračun faktoriala, pri katerem funkcija vsakič prejme dano vrednost, ki je ena večja ali manjša od ena - možnost implementacije je odvisna od preferenc razvijalca.

Ni pomembno, kako je faktorial "8!",algoritem, ki strogo sledi tej formuli.

Obdelava informacij je "matematika" popolnoma drugačnega reda. Rekurzivne funkcije in algoritmi tukaj delujejo na črkah, besedah, besednih zvezah, stavkih in odstavkih. Vsaka naslednja raven uporablja prejšnjo.

Vhodni tok podatkov se analizira v širokem razponu pogojev, vendar je postopek analize na splošno rekurziven. Ni smiselno pisati edinstvenih algoritmov za vse različice vhodnega toka. Obstajati mora ena funkcionalnost. Tukaj so rekurzivni algoritmi primeri, kako oblikovati izhodni tok, ki ustreza vhodu. To ni rezultat rekurzivnega algoritma, ampak je želena in potrebna rešitev.

Abstrakcija, rekurzija in OOP

Objektno usmerjeno programiranje (OOP) in rekurzija sta bistveno različni entiteti, vendar se odlično dopolnjujeta. Abstrakcija nima nič opraviti z rekurzijo, ampak skozi lečo OOP ustvarja možnost implementacije kontekstualne rekurzije.

Na primer, informacije se razčlenjujejo in črke, besede, besedne zveze, stavke in odstavki so označeni ločeno. Očitno bo razvijalec poskrbel za ustvarjanje primerkov objektov teh petih vrst in ponudil rešitev rekurzivnih algoritmov na vsaki ravni.

programiranje rekurzivnih algoritmov
programiranje rekurzivnih algoritmov

Medtem, če na ravni črk »ni smisla iskati pomena«, se semantika pojavi na ravni besed. Besede lahko razdelite na glagole, samostalnike, prislove, predloge … Lahko greste še dlje in definirate primere.

Na ravni fraze je semantika dopolnjena z ločili in logikobesedne kombinacije. Na ravni stavkov najdemo popolnejšo raven semantike in odstavek se lahko šteje za popolno misel.

Objektno usmerjen razvoj vnaprej določa dedovanje lastnosti in metod ter predlaga začetek hierarhije objektov z ustvarjanjem popolnoma abstraktnega prednika. Hkrati pa bo brez dvoma analiza vsakega potomca rekurzivna in se na tehnični ravni v številnih pozicijah (črke, besede, besedne zveze in stavke) ne bo preveč razlikovala. Odstavki, tako kot popolne misli, lahko izstopajo s tega seznama, vendar niso bistvo.

Pomembno je, da je večji del algoritma mogoče formulirati na ravni abstraktnega prednika in ga izpopolniti na ravni vsakega potomca s podatki in metodami, ki jih kličemo z abstraktne ravni. V tem kontekstu abstrakcija odpira nova obzorja za rekurzijo.

Zgodovinske značilnosti OOP

OOP je v svet programske opreme prišel dvakrat, čeprav bi nekateri strokovnjaki morda izpostavili pojav računalništva v oblaku in sodobnih idej o predmetih in razredih kot nov krog v razvoju IT tehnologij.

Izraza "object" in "objective" v sodobnem kontekstu OOP običajno pripisujemo 50. in 60. letih prejšnjega stoletja, vendar sta povezana z letom 1965 in pojavom Simula, Lisp, Algol, Smalltalk.

V tistih časih programiranje ni bilo posebej razvito in se ni moglo ustrezno odzvati na revolucionarne koncepte. Boj idej in programskih stilov (C / C ++ in Pascal - večinoma) je bil še daleč, baze podatkov pa so bile še konceptualno oblikovane.

rekurzivni rekurzivni algoritmi
rekurzivni rekurzivni algoritmi

V poznih 80. in zgodnjih 90. letih so se v Pascalu pojavili predmeti in vsi so se spomnili razredov v C / C ++ - to je pomenilo nov krog zanimanja za OOP in takrat orodja, predvsem programski jeziki, niso postala podpirajo le objektno usmerjene ideje, vendar se ustrezno razvijajo.

Seveda, če so bili prej rekurzivni algoritmi le funkcije, uporabljene v splošni kodi programa, bi zdaj rekurzija lahko postala del lastnosti predmeta (razreda), kar je nudilo zanimive priložnosti v kontekstu dedovanja.

Značilnost sodobnega OOP

Razvoj OOP je prvotno deklariran objekte (razrede) kot zbirke podatkov in lastnosti (metode). Pravzaprav je šlo za podatke, ki imajo sintakso in pomen. Toda takrat OOP ni bilo mogoče predstaviti kot orodje za upravljanje resničnih predmetov.

rekurzivne funkcije in algoritmi
rekurzivne funkcije in algoritmi

OOP je postal orodje za upravljanje objektov "računalniške narave". Skript, gumb, element menija, menijska vrstica, oznaka v oknu brskalnika je predmet. Ampak ne stroj, živilski izdelek, beseda ali stavek. Pravi predmeti so ostali zunaj objektno usmerjenega programiranja, računalniška orodja pa so dobila novo inkarnacijo.

Zaradi razlik v priljubljenih programskih jezikih se je pojavilo veliko narečij OOP. V semantičnem smislu sta praktično enakovredni, njihova osredotočenost na instrumentalno sfero in ne na uporabno omogoča, da se opis resničnih predmetov popelje onstranalgoritmov in zagotoviti njihov medplatformski in medjezikovni "obstoj".

Skladi in funkcijski klicni mehanizmi

Mehanizmi za klicanje funkcij (procedure, algoritmi) zahtevajo posredovanje podatkov (parametrov), vrnitev rezultata in zapomnitev naslova operaterja, ki mora prejeti nadzor, potem ko se funkcija (procedura) zaključi.

primeri rekurzivnih algoritmov
primeri rekurzivnih algoritmov

Običajno se za ta namen uporablja sklad, čeprav lahko programski jeziki ali razvijalec sam zagotovijo različne možnosti za prenos nadzora. Sodobno programiranje priznava, da ime funkcije ni lahko le parameter: lahko se oblikuje med izvajanjem algoritma. Algoritem lahko ustvarite tudi med izvajanjem drugega algoritma.

Koncept rekurzivnih algoritmov, ko se njihova imena in telesa lahko določijo v času oblikovanja naloge (izbire želenega algoritma), razširja rekurzivnost ne le na to, kako nekaj narediti, ampak tudi, kdo točno bi moral naredi. Izbira algoritma po njegovem "smiselnem" imenu je obetavna, vendar povzroča težave.

Rekurzivnost na nizu funkcij

Ne morete reči, da je algoritem rekurziven, ko pokliče samega sebe in to je to. Programiranje ni dogma in koncept rekurzivnosti ni izključna zahteva, da se kličete iz telesa lastnega algoritma.

Praktične aplikacije ne dajejo vedno čiste rešitve. Pogosto je treba pripraviti začetne podatke, rezultat rekurzivnega klica pa analizirati v kontekstu celotnega problema (celotnega algoritma) vna splošno.

Pravzaprav ne samo, preden se pokliče rekurzivna funkcija, ampak tudi potem, ko je končana, se lahko ali mora poklicati drug program. Če s klicem ni posebnih težav: rekurzivna funkcija A() pokliče funkcijo B(), ki nekaj naredi in pokliče A(), potem takoj pride do težave z vrnitvijo nadzora. Po zaključku rekurzivnega klica mora funkcija A() prejeti nadzor, da lahko ponovno prikliče B(), ki jo bo znova poklical. Vračanje nadzora, kot bi moralo biti v skladu nazaj na B(), je napačna rešitev.

Programer ni omejen pri izbiri parametrov in jih lahko dopolni z imeni funkcij. Z drugimi besedami, idealna rešitev je, da prenesete ime B() v A() in pustite, da A() sam pokliče B(). V tem primeru ne bo težav z vračanjem nadzora, izvedba rekurzivnega algoritma pa bo bolj pregledna.

Razumevanje in stopnja rekurzije

Težava pri razvoju rekurzivnih algoritmov je, da morate razumeti dinamiko procesa. Pri uporabi rekurzije v objektnih metodah, zlasti na ravni abstraktnega prednika, obstaja problem razumevanja lastnega algoritma v kontekstu njegovega izvajalnega časa.

reševanje rekurzivnih algoritmov
reševanje rekurzivnih algoritmov

Trenutno ni omejitev glede ravni gnezdenja funkcij in zmogljivosti sklada v klicnih mehanizmih, vendar obstaja težava z razumevanjem: v katerem trenutku, katera raven podatkov ali katero mesto v splošnem algoritmu se imenuje rekurzivna funkcijo in na kakšnem številu klicev je sama.

Obstoječa orodja za odpravljanje napak so pogosto nemočnapovej programerju pravo rešitev.

Zanke in rekurzija

Šteje se, da je ciklična izvedba enakovredna rekurziji. Dejansko je v nekaterih primerih mogoče rekurzivni algoritem implementirati v sintaksi pogojnih in cikličnih konstrukcij.

Vendar, če obstaja jasno razumevanje, da je treba določeno funkcijo izvajati z rekurzivnim algoritmom, je treba opustiti vsako zunanjo uporabo zanke ali pogojnih stavkov.

implementacija rekurzivnih algoritmov
implementacija rekurzivnih algoritmov

Pomen tukaj je, da bo rekurzivna rešitev v obliki funkcije, ki uporablja samo sebe, popoln, funkcionalno popoln algoritem. Ta algoritem bo zahteval, da ga programer ustvari s trudom in razume dinamiko algoritma, vendar bo to končna rešitev, ki ne zahteva zunanjega nadzora.

Nobena kombinacija zunanjih pogojnih in cikličnih operatorjev nam ne bo omogočila, da bi rekurzivni algoritem predstavili kot popolno funkcijo.

Rekurzivni konsenz in OOP

Pri skoraj vseh variantah razvoja rekurzivnega algoritma se pojavi načrt za razvoj dveh algoritmov. Prvi algoritem ustvari seznam prihodnjih objektov (primerkov), drugi algoritem pa je pravzaprav rekurzivna funkcija.

Najboljša rešitev bi bila urediti rekurzijo kot eno lastnost (metodo), ki dejansko vsebuje rekurzivni algoritem, in prenesti vse pripravljalno delo v konstruktor objektov.

Rekurzivni algoritem bo prava rešitev le, ko delujesamo sam, brez zunanjega nadzora in vodenja. Zunanji algoritem lahko da samo signal za delovanje. Rezultat tega dela bi morala biti pričakovana rešitev brez zunanje podpore.

Rekurzija mora biti vedno popolna samostojna rešitev.

Intuitivno razumevanje in funkcionalna popolnost

Ko je objektno usmerjeno programiranje postalo de facto standard, je postalo očitno, da morate za učinkovito kodiranje spremeniti svoje razmišljanje. Programer se mora med izvajanjem algoritma premakniti od sintakse in semantike jezika k dinamiki semantike.

Značilnost rekurzije: lahko se uporablja za vse:

  • strganje po spletu;
  • iskalne operacije;
  • razčlenitev besedilnih informacij;
  • branje ali ustvarjanje dokumentov MS Word;
  • vzorčenje ali analiza oznak…

Značilnost OOP: omogoča opisovanje rekurzivnega algoritma na ravni abstraktnega prednika, vendar zagotavlja, da se nanaša na edinstvene potomce, od katerih ima vsak svojo paleto podatkov in lastnosti.

koncept rekurzivnih algoritmov
koncept rekurzivnih algoritmov

Rekurzija je idealna, ker zahteva funkcionalno popolnost svojega algoritma. OOP izboljša zmogljivost rekurzivnega algoritma tako, da mu omogoči dostop do vseh edinstvenih otrok.

Priporočena: