Algoritmul recursiv: descriere, analiză, caracteristici și exemple

Înțelegerea modernă a recursivității: definirea funcționalității și accesul la aceasta din afară și din această funcție. Se crede că recursiunea sa născut de matematicieni: calcul factorial, serii infinite, fractale, fracții continue ... Cu toate acestea, recurența poate fi găsită peste tot. Obiectivele legale naturale "socotesc" recursiunea ca algoritmul lor de bază și forma de exprimare (existență) nu atât a obiectelor lumii materiale cât și a algoritmului de bază al mișcării.

algoritmul recursiv

Oamenii de diferite specialități din diferite domenii ale științei și tehnologiei folosesc algoritmul recursiv f (x), unde "x ~ / = f (x)". O funcție care se numește o soluție puternică, însă formarea și înțelegerea acestei soluții, în majoritatea cazurilor, este o sarcină foarte dificilă.

În antichitate, recursivitatea a fost folosită pentru a mări spațiul palatului. Printr-un sistem de oglinzi care se îndreaptă unul spre altul, puteți crea efecte spațiale volumetrice uimitoare. Dar este ușor să înțelegeți cum să configurați aceste oglinzi? Și este chiar mai dificil să se determine unde este loc punctul din spațiu, reflectat prin mai multe oglinzi.

Recursiune, recursivă algoritmi: sensul și sintaxa

O sarcină care este formulată prin repetarea unei secvențe de operații poate fi rezolvată recursiv. Un algoritm simplu (calculul unei ecuații patrate, un script pentru umplerea unei pagini web cu informații, citirea unui fișier, trimiterea unui mesaj ...) nu necesită recurs.

Principalele diferențe ale algoritmului, care permit o soluție recursivă:

  • există un algoritm care trebuie executat de mai multe ori;
  • algoritmul are nevoie de date care se modifică de fiecare dată;
  • Algoritmul nu trebuie să se schimbe de fiecare dată;
  • există o condiție finală: algoritmul este recursiv - nu infinit.

În general, nu se poate afirma că o singură executare este o condiție obligatorie pentru absența unei ocazii de recurs. De asemenea, nu puteți solicita o condiție finală obligatorie: recurențele infinite au sfera lor de aplicare.

Algoritmul este recursiv: când o secvență de operații este efectuată în mod repetat, pe date care se modifică de fiecare dată și dau câte un rezultat nou de fiecare dată.

Formula de recursiune

Înțelegerea matematică a recursivității și a analogului său în programare este diferită. Matematica, deși este caracteristică programării, dar programarea este o matematică mult mai mare.

algoritmul recursiv f

Un algoritm bine scris este ca o oglindă a intelectului autorului. Formula generală de recurs în programarea "f (x)", unde "x ~ / = f (x)" are cel puțin două variante de interpretare. Aici, "~" este similitudinea sau absența rezultatului, iar "=" este prezența rezultatului funcției.

Prima opțiune: dinamica datelor.

  • funcția "f (x)" are algoritmul recursiv și nu variabil;
  • "X" și rezultatul "f (x)" - de fiecare dată când au valori noi, rezultatul "f (x)" este un nou parametru "x" al acestei funcții.

A doua opțiune: dinamica codului.

  • funcția "f (x)" are mai mulți algoritmi care rafinează (analizează) datele;
  • analiza datelor - o parte a codului și implementarea algoritmilor recursivi care efectuează acțiunea dorită - a doua parte a codului;
  • rezultatul funcției "f (x)" nu este.

Lipsa rezultatului este normală. Programarea nu este matematică, rezultatul nu este neapărat acolo. O funcție care este executată recursiv poate parcurge pur și simplu situri și poate popula o bază de date sau poate crea instanțele dorite de obiecte în funcție de fluxul de intrare introdus.

Datele și recursul

Programarea algoritmilor recursivi nu este un calcul al factoriului în care funcția primește de fiecare dată când o dată este diferită de una la o parte mai mică sau mai mare - varianta de implementare depinde de preferința dezvoltatorului.

Nu contează la fel de privit ca factorial "8!", Moving de la 0, 1, 2, ..., sau vice-versa 8, 7, 6 ... calcul în mod similar secvențe matematice, seria fractală sau infinit se înregistrează și o formulă matematică simplă, respectiv, algoritm care urmărește cu strictețe această formulă.

Prelucrarea informațiilor este o "matematică" cu o ordine complet diferită. Funcțiile și algoritmii recursive aici funcționează cu litere, cuvinte, fraze, fraze și paragrafe. Fiecare nivel următor utilizează cel precedent.

Fluxul de date de intrare este analizat într-o gamă largă de condiții, dar procesul de analiză este, în general, recursiv. Nu are sens să scriem algoritmi unici pentru toate variantele fluxului de intrare. Trebuie să existe o funcție funcțională. Aici, algoritmii recursivi sunt exemple de generare a unui flux de ieșire care este adecvat pentru intrare. Acest lucru nu este rezultatul introducerii algoritmului recursiv, dar aceasta este soluția dorită și necesară.

Abstracție, recursivitate și OOP

Programarea orientată pe obiecte (OOP) și recursivitatea sunt entități fundamentale diferite, dar se completează perfect unul cu celălalt. Abstracția nu are nimic de-a face cu recursiunea, dar prin prisma POR face posibilă implementarea recursivității contextuale.

De exemplu, informațiile sunt analizate și ieși afară litere separate, cuvinte, fraze, fraze și paragrafe. Evident, dezvoltatorul va oferi pentru crearea de instanțe de obiecte din aceste cinci tipuri și va oferi rezolvarea algoritmilor recursivi la fiecare nivel.

programarea algoritmilor recursivi

Între timp, dacă la nivelul literelor "nu are sens să căutăm sensul", semantica apare la nivelul cuvintelor. Puteți împărți cuvintele în verbe, substantive, adverbe, prepoziții ... Puteți merge mai departe și puteți defini cazul.

La nivel de fraze, semantica este completată de semne de punctuație și de logica combinației de cuvinte. La nivel de teză se găsește un nivel mai avansat de semantică, iar paragraful poate fi privit ca un gând complet.

Dezvoltarea orientată spre obiect determină moștenirea proprietăților și a metodelor și oferă o ierarhie obiect pornind prin crearea unui strămoș complet abstract. În același timp, fără îndoială, analiza fiecărui copil va fi recursiv în natură și nu diferă mult la nivel tehnic pe mai multe elemente (litere, cuvinte, fraze și propoziții). Punctele, ca gânduri completate, pot ieși din această listă, dar nu esența.

Este important ca partea covârșitoare a algoritmului să poată fi formulată la nivelul strămoșului abstract, perfecționându-l la nivelul fiecărui descendent prin date și metode numite de la nivelul abstract. În acest context, abstractizarea deschide noi orizonturi pentru recurs.

Caracteristicile istorice ale OOP

OOP a venit de două ori în lumea programelor, deși unii experți pot evidenția apariția tehnologiilor cloud și a ideilor moderne despre obiecte și clase, ca o nouă rundă în dezvoltarea tehnologiilor IT.

Termenii „subiect“ și „obiect“, în contextul actual al OEP, de obicei atribuit anilor 50 si a 60-a secolului trecut, dar le asociază cu 1965 și apariția limbajului Simula, Lisp, Algol, Smalltalk.

În acele zile, programarea nu era foarte specială și nu putea răspunde în mod adecvat conceptelor revoluționare. Înainte de lupta ideilor și a stilurilor de programare (C / C ++ și Pascal - în cea mai mare parte) era încă departe, iar bazele de date erau încă formate din punct de vedere conceptual.

algoritmi recursivi recursivi

În anii `80 târziu și începutul anilor 90 a lui Pascal a apărut obiecte și toate gândirea claselor în C / C ++ - acesta a marcat o nouă rundă de interes pentru OEP, și atunci instrumentele, limbaje special de programare au devenit nu doar un sprijin orientat-obiect idei, dar, de asemenea, să se dezvolte în funcție de ele.

Desigur, în cazul în care, înainte de algoritmul recursiv este o funcție simplă utilizată în codul general al programului, acum recursie ar putea deveni o parte a proprietăților unui obiect (clasa), în contextul moștenirii oferă oportunități interesante.

Caracteristica OOP moderne



Dezvoltarea OOP inițial a declarat obiecte (clase) ca o colecție de date și proprietăți (metode). De fapt, era vorba despre date care au sintaxă și semnificație. Dar nu a fost posibil să se reprezinte OOP ca un instrument pentru gestionarea obiectelor reale.

funcții și algoritmi recursivi

OOP sa transformat într-un instrument pentru gestionarea obiectelor de "natură computerizată". Un script, un buton, un element de meniu, o bară de meniu, o etichetă în fereastra browserului este un obiect. Dar nu o mașină-unelte, un produs alimentar, un cuvânt sau o ofertă. Obiectele reale au rămas în afara sferei de programare orientată obiect, iar instrumentele de calculator au dobândit o nouă încarnare.

Datorită diferențelor dintre limbile de programare populare, au apărut multe dialecte OOP. Semantically acestea sunt practic echivalente, iar concentrarea lor pe sfera instrumentală, nu aplicația, face posibilă pentru a face descrierea obiectelor reale dincolo de algoritmi și de a asigura lor cross-platform și limba cruce „existență“.

Stive și mecanisme pentru apelarea funcțiilor

Mecanismele de apelare a funcțiilor (proceduri, algoritmi) necesită transferul de date (parametrii), returnarea rezultatelor și stocarea adresei operatorului, care trebuie să primească control după terminarea funcției (procedurii).

exemple de algoritmi recursivi

De obicei, pentru aceste scopuri este utilizat un teanc, deși limbile de programare sau programatorul dezvoltator poate asigura o varietate largă de opțiuni de transfer de control. Programarea modernă permite ca numele funcției să nu fie doar un parametru: poate fi format în timpul executării algoritmului. De asemenea, algoritmul poate fi creat în timpul executării unui alt algoritm.

Noțiunea de algoritmi recursive, atunci când numele lor și corpul poate fi determinată în momentul sarcinii (selectați algoritmul dorit) recursiveness nu se extinde numai cu privire la modul de a face ceva, dar cine anume ar trebui să facă. Alegerea algoritmului pentru numele său "semnificativ" este promițătoare, dar creează dificultăți.

Recursivitatea asupra setului de funcții

Nu se poate spune că algoritmul este recursiv atunci când se numește singur și numai. Programarea nu este o dogma, însă noțiunea de recursivitate nu este o cerință exclusivă de a vă numi din corpul propriului algoritm.

Aplicațiile practice nu oferă întotdeauna o soluție curată. Adesea, datele sursă ar trebui să fie pregătite, iar rezultatul unui apel recursiv trebuie analizat în contextul întregii sarcini (întregul algoritm) ca un întreg.

De fapt, nu numai pentru a apela o funcție recursive, dar, de asemenea, după finalizarea acesteia, sau un alt program poate fi numit. În cazul în care o provocare fără probleme: o funcție A recursive () solicită funcția B (), care face ceva și numește (), apoi, imediat, există o problemă cu revenirea. După îndeplinirea apelului recursiv, funcția A () ar trebui să primească controlul pentru a re-invoca B (), care o va suna din nou. Întoarcerea de control, după cum urmează, în stivă înapoi la B () - decizia greșită.

Programatorul nu este limitat la alegerea parametrilor și poate fi echipat cu numele funcțiilor. Cu alte cuvinte, soluția ideală este să treci numele B () la A () și să lăsăm A () să apeleze la B (). În acest caz, nu vor exista probleme cu returnarea controlului, iar implementarea algoritmului recursiv va fi mai transparentă.

Înțelegerea și nivelul recurenței

Problema dezvoltării algoritmilor recursivi este că trebuie să aveți o idee despre dinamica procesului. Când utilizați recursivitate în metodele obiectelor, în special la nivelul strămoș abstract, există problema de înțelegere a propriei lor algoritm, în contextul în momentul executării sale.

soluție de algoritmi recursivi

În prezent, nu există restricții cu privire la nivelul funcțiilor cuibărit și capacitățile acestora în mecanismele de stiva de apel, dar există problema de înțelegere a ceea ce punct în timp un nivel de date, sau ce fel de loc în algoritmul general, pentru a efectua un apel al unei funcții recursive și de cât de multe apeluri în sine este.

Instrumentele de depanare existente sunt adesea neputincioase pentru a spune programatorului soluția potrivită.

Cicluri și recursiune

Se presupune că execuția ciclică este echivalentă cu recursul. Într-adevăr, în unele cazuri, un algoritm recursiv poate fi implementat în sintaxa construcțiilor condiționale și ciclice.

Cu toate acestea, dacă există o înțelegere clară că o anumită funcție ar trebui implementată printr-un algoritm recursiv, ar trebui să renunțați la orice utilizare externă a buclă sau afirmații condiționale.

implementarea algoritmilor recursivi

Ideea aici este că o soluție recursivă sub forma unei funcții care se va folosi în sine va fi un algoritm complet, complet funcțional. Acest algoritm va necesita eforturile programatorului la crearea acestuia, înțelegând dinamica algoritmului, dar va fi soluția finală care nu necesită control extern.

Orice combinație de operatori condiționale externi și ciclice nu permit să prezinte un algoritm recursiv sub forma unei funcții complet plin.

Consensul de recursiune și OOP

Aproape în toate variantele dezvoltării algoritmului recursiv, apare un plan de dezvoltare a doi algoritmi. Primul algoritm formează o listă de obiecte viitoare (instanțe), iar al doilea algoritm este o funcție recursivă adecvată.

Cea mai bună soluție ar fi să se aranjeze într-un singur proprietăți recursie (metoda) care cuprinde de fapt un algoritm recursiv, și toate pregătirile pentru a face constructorului.

Un algoritm recursiv va fi soluția potrivită numai atunci când funcționează singur, fără control extern și control. Un algoritm extern poate da doar un semnal de lucru. Rezultatul acestei lucrări ar trebui să fie soluția așteptată, fără sprijin extern.

Recurgerea trebuie să fie întotdeauna o decizie independentă completă.

Înțelegere intuitivă și completitudine funcțională

Atunci când programarea orientată-obiect a devenit un standard de facto, a devenit evident: pentru o codificare eficientă, propria gândire ar trebui schimbată. Programatorul trebuie să se deplaseze de sintaxa si semantica semantica limbajului la dinamica în cadrul algoritmului.

O caracteristică caracteristică a recursivității: poate fi aplicată în toate aspectele:

  • parsarea site-urilor -
  • operațiunile de căutare-
  • analiza informațiilor despre text -
  • citirea sau crearea MS Word-
  • eșantionarea sau analizarea etichetelor ...

O trăsătură caracteristică a OOP: ea face posibilă pentru a descrie un algoritm recursiv la nivelul strămoș abstract, ci include în el un apel unic descendenților, fiecare dintre care are propriile date paleta și proprietăți.

conceptul de algoritmi recursivi

Recursia este ideală, deoarece necesită completitudinea funcțională a algoritmului său. OOP îmbunătățește calitatea algoritmului recursiv, oferindu-i acces la toți descendenții unici.

Distribuiți pe rețelele sociale:

înrudit
Ce este o analiză fractalăCe este o analiză fractală
Ce sunt algoritmii și de ce sunt necesare?Ce sunt algoritmii și de ce sunt necesare?
Tipuri de bază și exemple de algoritmi cicliciTipuri de bază și exemple de algoritmi ciclici
Conceptul algoritmului și proprietățile algoritmului. Tipuri de algoritmiConceptul algoritmului și proprietățile algoritmului. Tipuri de algoritmi
Algoritmul Kruskal - construirea scheletului optimAlgoritmul Kruskal - construirea scheletului optim
Recurgerea este ce? Recurgerea la programare (exemple)Recurgerea este ce? Recurgerea la programare (exemple)
Bow recursiv: design, avantajeBow recursiv: design, avantaje
Ce este un algoritm cu ramificare? Exemple și definiții ale algoritmilor de ramificareCe este un algoritm cu ramificare? Exemple și definiții ale algoritmilor de ramificare
Metode de descriere a algoritmilor și a tipurilor de algoritmiMetode de descriere a algoritmilor și a tipurilor de algoritmi
Funcția de tabulare: cum se scrie un program?Funcția de tabulare: cum se scrie un program?
» » Algoritmul recursiv: descriere, analiză, caracteristici și exemple