Rekursiivne algoritm: kirjeldus, analüüs, funktsioonid ja näited

Sisukord:

Rekursiivne algoritm: kirjeldus, analüüs, funktsioonid ja näited
Rekursiivne algoritm: kirjeldus, analüüs, funktsioonid ja näited
Anonim

Kaasaegne arusaam rekursioonist: funktsionaalsuse määratlus ja juurdepääs sellele väljastpoolt ja sellest funktsioonist. Arvatakse, et rekursioon sündis matemaatikute poolt: faktoriaalarvutus, lõpmatud jadad, fraktalid, jätkumurrud… Rekursiooni leiab aga ig alt poolt. Objektiivsed loodusseadused “peavad” rekursiooni oma peamiseks algoritmiks ja väljendusvormiks (eksistentsiks) mitte niivõrd materiaalse maailma objektide puhul, vaid üldiselt peamiseks liikumise algoritmiks.

rekursiivne algoritm
rekursiivne algoritm

Erinevate teadus- ja tehnikavaldkondade erinevate erialade inimesed kasutavad rekursiivset algoritmi f (x), kus "x ~/=f (x)". Funktsioon, mis kutsub ennast ise, on tugev lahendus, kuid selle lahenduse moodustamine ja mõistmine on enamikul juhtudel väga keeruline ülesanne.

Iidsetel aegadel kasutati palee ruumi suurendamiseks rekursiooni. Üksteisele suunatud peeglite süsteemi kaudu saate luua vapustavaid kolmemõõtmelisi ruumiefekte. Kuid kas see on nii lihtne mõista, kuidasreguleerida neid peegleid? Veelgi keerulisem on kindlaks teha, kus ruumipunkt asub, peegeldudes läbi mitme peegli.

Rekursioon, rekursiivsed algoritmid: tähendus ja süntaks

Tegevuste jada kordamise teel sõnastatud ülesannet saab lahendada rekursiivselt. Lihtne algoritm (ruutvõrrandi arvutamine, skript veebilehe teabega täitmiseks, faili lugemine, sõnumi saatmine…) ei vaja rekursiooni.

Rekursiivset lahendust võimaldava algoritmi peamised erinevused:

  • on algoritm, mida tuleb mitu korda käivitada;
  • algoritm vajab andmeid, mis muutuvad iga kord;
  • algoritm ei pea iga kord muutuma;
  • on viimane tingimus: algoritm on rekursiivne – mitte lõpmatu.

Üldiselt ei saa väita, et ühekordne täitmine on rekursiooni põhjuse puudumise vajalik tingimus. Samuti ei saa te nõuda kohustuslikku lõpptingimust: lõpmatutel rekursioonidel on oma ulatus.

Algoritm on rekursiivne: kui toimingute jada sooritatakse korduv alt andmetega, mis muutuvad iga kord ja annavad iga kord uue tulemuse.

Rekursioonivalem

Matemaatiline arusaam rekursioonist ja selle analoogist programmeerimises on erinev. Matemaatika, kuigi programmeerimisest on märke, on programmeerimine palju kõrgemat sorti matemaatika.

rekursiivne algoritm f
rekursiivne algoritm f

Hästi kirjutatud algoritm on nagu selle autori intellekti peegel. Kindralrekursioonivalem programmeerimises on "f(x)", kus "x ~/=f(x)" on vähem alt kahe tõlgendusega. Siin on "~" tulemuse sarnasus või puudumine ja on funktsiooni tulemuse olemasolu.

Esimene valik: andmete dünaamika.

  • funktsioonil "f(x)" on rekursiivne ja muutumatu algoritm;
  • "x" ja tulemusel "f(x)" on iga kord uued väärtused, tulemus "f(x)" on selle funktsiooni uus "x" parameeter.

Teine valik: koodi dünaamika.

  • funktsioonil "f(x)" on mitu algoritmi, mis täpsustavad (analüüsivad) andmeid;
  • andmete analüüs - üks osa koodist ja rekursiivsete algoritmide rakendamine, mis sooritavad soovitud toimingu - koodi teine osa;
  • funktsiooni "f(x)" tulemus ei ole.

Ükski tulemus pole normaalne. Programmeerimine ei ole matemaatika, siin ei pea tulemus selgesõnaliselt olemas olema. Rekursiivne funktsioon võib lihts alt saite sõeluda ja andmebaasi täita või objekte luua vastav alt sissetulevale sisendile.

Andmed ja rekursioon

Rekursiivsete algoritmide programmeerimine ei seisne faktoriaali arvutamises, kus funktsioon saab iga kord etteantud väärtuse, mis on üks rohkem või väiksem kui üks – teostusvalik sõltub arendaja eelistustest.

Pole tähtis, kuidas faktoriaal "8!"algoritm, mis järgib rangelt seda valemit.

Teabe töötlemine on täiesti erinevas järjekorras "matemaatika". Rekursiivsed funktsioonid ja algoritmid töötavad siin tähtede, sõnade, fraaside, lausete ja lõikude alusel. Iga järgmine tase kasutab eelmist.

Sisendandmevoogu analüüsitakse paljudes tingimustes, kuid analüüsiprotsess on üldiselt rekursiivne. Pole mõtet kirjutada sisendvoo kõikide variantide jaoks ainulaadseid algoritme. Peaks olema üks funktsioon. Siin on rekursiivsed algoritmid näited selle kohta, kuidas moodustada sisendile adekvaatne väljundvoog. See ei ole rekursiivse algoritmi väljund, kuid see on soovitud ja vajalik lahendus.

Abstraktsioon, rekursioon ja OOP

Objektorienteeritud programmeerimine (OOP) ja rekursioon on põhimõtteliselt erinevad olemid, kuid täiendavad üksteist suurepäraselt. Abstraktsioonil pole rekursiooniga mingit pistmist, kuid läbi OOP-objektiivi loob see võimaluse rakendada kontekstuaalset rekursiooni.

Näiteks sõelutakse teavet ning tähed, sõnad, fraasid, laused ja lõigud tõstetakse eraldi esile. Ilmselgelt näeb arendaja ette seda viit tüüpi objektide eksemplaride loomise ja pakub igal tasemel rekursiivsete algoritmide lahendust.

rekursiivsete algoritmide programmeerimine
rekursiivsete algoritmide programmeerimine

Kui aga tähtede tasemel “pole mõtet mõtet otsida”, siis sõnade tasandil esineb semantika. Sõnu saab jagada tegusõnadeks, nimisõnadeks, määrsõnadeks, eessõnadeks… Võite minna kaugemale ja määrata käände.

Fraasitasandil täiendavad semantikat kirjavahemärgid ja loogikasõnaühendid. Lausete tasemel leitakse täiuslikum semantika tase ja lõiku võib pidada terviklikuks mõtteks.

Objektorienteeritud arendus määrab omaduste ja meetodite pärilikkuse ning teeb ettepaneku alustada objektide hierarhiat täiesti abstraktse esivanema loomisega. Samas on kahtlemata iga järeltulija analüüs rekursiivne ega erine tehnilisel tasemel väga paljudes positsioonides (tähed, sõnad, fraasid ja laused). Lõigud, nagu ka terviklikud mõtted, võivad sellest loendist välja paista, kuid need pole sisulised.

On oluline, et valdava osa algoritmist saaks formuleerida abstraktse esivanema tasandil, täpsustades seda iga järeltulija tasemel abstraktselt tasandilt kutsutud andmete ja meetoditega. Selles kontekstis avab abstraktsioon rekursiooniks uusi horisonte.

OOP ajaloolised tunnused

OOP on tarkvaramaailma jõudnud kaks korda, kuigi mõned eksperdid võivad IT-tehnoloogiate arendamise uue ringina esile tõsta pilvandmetöötluse ja kaasaegsete ideede esilekerkimist objektide ja klasside kohta.

Mõisteid "objekt" ja "objektiiv" omistatakse OOP kaasaegses kontekstis tavaliselt eelmise sajandi 50-60ndatele, kuid neid seostatakse 1965. aastaga ning Simula, Lispi, Algoli, Smalltalki tekkega..

Tol päevil ei olnud programmeerimine eriti arenenud ega suutnud revolutsioonilistele ideedele adekvaatselt reageerida. Ideede ja programmeerimisstiilide võitlus (C / C ++ ja Pascal - enamasti) oli veel kaugel ja andmebaasid olid endiselt kontseptuaalselt moodustatud.

rekursioon rekursiivsed algoritmid
rekursioon rekursiivsed algoritmid

80ndate lõpus ja 90ndate alguses ilmusid Pascalis objektid ja kõik mäletasid C / C ++ klassid – see tähistas uut huviringi OOP vastu ja just siis muutusid tööriistad, peamiselt programmeerimiskeeled, mitte. toetavad ainult objektorienteeritud ideid, kuid arenevad vastav alt.

Muidugi, kui varasemad rekursiivsed algoritmid olid vaid funktsioonid, mida kasutati programmi üldkoodis, siis nüüd võis rekursioon saada osaks objekti (klassi) omadustest, mis pakkus pärimise kontekstis huvitavaid võimalusi.

Moodsa OOP-i funktsioon

OOP-i arendus deklareeris objektid (klassid) algselt andmete ja omaduste (meetodite) kogumikena. Tegelikult oli tegemist andmetega, millel on süntaks ja tähendus. Kuid siis ei olnud võimalik OOP-i esitada reaalsete objektide haldamise tööriistana.

rekursiivsed funktsioonid ja algoritmid
rekursiivsed funktsioonid ja algoritmid

OOP-ist on saanud tööriist "arvutilooduse" objektide haldamiseks. Skript, nupp, menüüelement, menüüriba, silt brauseriaknas on objekt. Aga mitte masin, toiduaine, sõna ega lause. Pärisobjektid on jäänud objektorienteeritud programmeerimisest väljapoole ja arvutitööriistad on saanud uue kehastuse.

Populaarsete programmeerimiskeelte erinevuste tõttu on tekkinud palju OOP-i murdeid. Semantika poolest on need praktiliselt samaväärsed ja nende keskendumine instrumentaalsele sfäärile, mitte rakenduslikule, võimaldab reaalsete objektide kirjeldamist viia kaugemale.algoritme ja tagada nende platvormide- ja keelteülene "olemasolu".

Pirnad ja funktsioonide kutsumise mehhanismid

Funktsioonide kutsumise mehhanismid (protseduurid, algoritmid) nõuavad andmete (parameetrite) edastamist, tulemuse tagastamist ja operaatori aadressi meeldejätmist, mis peab pärast funktsiooni (protseduuri) lõpetamist kontrolli saama.

rekursiivsete algoritmide näited
rekursiivsete algoritmide näited

Tavaliselt kasutatakse selleks pinu, kuigi programmeerimiskeeled või arendaja ise võivad pakkuda erinevaid võimalusi juhtimise ülekandmiseks. Kaasaegne programmeerimine tunnistab, et funktsiooni nimi ei saa olla ainult parameeter: see võib tekkida algoritmi täitmise käigus. Algoritmi saab luua ka teise algoritmi täitmise ajal.

Rekursiivsete algoritmide mõiste, kui nende nimed ja kehad saab määrata ülesande moodustamise ajal (soovitava algoritmi valimisel), laiendab rekursiivsust mitte ainult sellele, kuidas midagi teha, vaid ka seda, kes täpselt peaks tee seda. Algoritmi valimine selle "tähendusliku" nime järgi on paljutõotav, kuid tekitab raskusi.

Rekursiivsus funktsioonide komplektis

Ei saa öelda, et algoritm on rekursiivne, kui ta ise kutsub ja kõik. Programmeerimine ei ole dogma ja rekursiivsuse mõiste ei ole ainunõue, et kutsuda ennast oma algoritmi põhiosast.

Praktilised rakendused ei anna alati puhast lahendust. Sageli tuleb algandmed ette valmistada ning rekursiivse kõne tulemust analüüsida kogu probleemi (kogu algoritmi) kontekstis.üldiselt.

Tegelikult, mitte ainult enne rekursiivse funktsiooni kutsumist, vaid ka pärast selle lõpetamist saab või peaks kutsuma mõnda teist programmi. Kui väljakutsega erilisi probleeme pole: rekursiivne funktsioon A() kutsub funktsiooni B(), mis teeb midagi ja kutsub välja A(), siis on kohe probleem kontrolli tagastamisega. Pärast rekursiivse kõne lõpetamist peab funktsioon A() saama kontrolli, et uuesti kutsuda B(), mis kutsub seda uuesti. Juhtelemendi tagastamine, nagu see peaks olema virnas, tagasi B()-le on vale lahendus.

Programmeerija ei ole parameetrite valikul piiratud ja võib neid täiendada funktsioonide nimedega. Teisisõnu, ideaalne lahendus on anda B() nimi A()-le ja lasta A()-l endal kutsuda B(). Sel juhul ei teki probleeme juhtimise tagastamisega ja rekursiivse algoritmi rakendamine on läbipaistvam.

Mõistmine ja rekursiooni tase

Rekursiivsete algoritmide väljatöötamise probleem seisneb selles, et peate mõistma protsessi dünaamikat. Objektimeetodites rekursiooni kasutamisel, eriti abstraktse esivanema tasemel, tekib probleem oma algoritmi mõistmisega selle täitmisaja kontekstis.

rekursiivsete algoritmide lahendamine
rekursiivsete algoritmide lahendamine

Praegu ei ole kõnemehhanismides funktsioonide pesastustasemele ja virna mahule piiranguid, kuid probleem on arusaamisega: millisel ajahetkel millist andmetaset või kohta üldalgoritmis nimetatakse rekursiivseks. funktsiooni ja mitu kõnet ta ise teeb.

Olemasolevad silumistööriistad on sageli jõuetudütle programmeerijale õige lahendus.

Silmused ja rekursioon

Arvatakse, et tsükliline täitmine on samaväärne rekursiooniga. Tõepoolest, mõnel juhul saab rekursiivset algoritmi rakendada tingimuslike ja tsükliliste konstruktsioonide süntaksis.

Kui aga on selge arusaam, et konkreetne funktsioon tuleb realiseerida rekursiivse algoritmi kaudu, tuleks tsükli või tingimuslausete igasugusest välisest kasutamisest loobuda.

rekursiivsete algoritmide rakendamine
rekursiivsete algoritmide rakendamine

Siin on tähendus, et rekursiivne lahendus funktsiooni kujul, mis kasutab ennast, on terviklik, funktsionaalselt terviklik algoritm. See algoritm nõuab, et programmeerija looks selle vaevaga, mõistes algoritmi dünaamikat, kuid see on lõplik lahendus, mis ei vaja välist juhtimist.

Mis tahes väliste tingimuslike ja tsükliliste operaatorite kombinatsioon ei võimalda meil esitada rekursiivset algoritmi tervikliku funktsioonina.

Rekursiooni konsensus ja OOP

Peaaegu kõigis rekursiivse algoritmi väljatöötamise variantides tekib plaan töötada välja kaks algoritmi. Esimene algoritm genereerib tulevaste objektide (eksemplaride) loendi ja teine algoritm on tegelikult rekursiivne funktsioon.

Parim lahendus oleks korraldada rekursioon ühe omadusena (meetodina), mis tegelikult sisaldab rekursiivset algoritmi, ja panna kogu ettevalmistustöö objektikonstruktorisse.

Rekursiivne algoritm on õige lahendus ainult siis, kui see töötabainult ise, ilma välise kontrolli ja juhtimiseta. Väline algoritm saab anda ainult signaali tööle. Selle töö tulemus peaks olema oodatud lahendus ilma välise toetuseta.

Rekursioon peaks alati olema täielik iseseisev lahendus.

Intuitiivne arusaam ja funktsionaalne täielikkus

Kui objektorienteeritud programmeerimine sai de facto standardiks, sai selgeks, et tõhusaks kodeerimiseks peate muutma oma mõtlemist. Programmeerija peab algoritmi täitmise käigus liikuma keele süntaksilt ja semantik alt semantika dünaamikale.

Rekursioonile iseloomulik: seda saab rakendada kõigele:

  • veebi kraapimine;
  • otsingutoimingud;
  • tekstiteabe sõelumine;
  • MS Wordi dokumentide lugemine või loomine;
  • siltide proovide võtmine või analüüsimine…

OOP-le iseloomulik: see võimaldab kirjeldada rekursiivset algoritmi abstraktse esivanema tasemel, kuid näeb ette, et see viitab ainulaadsetele järglastele, millest igaühel on oma andmete ja omaduste palett.

rekursiivsete algoritmide kontseptsioon
rekursiivsete algoritmide kontseptsioon

Rekursioon on ideaalne, kuna nõuab selle algoritmi funktsionaalset täielikkust. OOP parandab rekursiivse algoritmi jõudlust, andes sellele juurdepääsu kõigile ainulaadsetele lastele.

Soovitan: