Moderno razumijevanje rekurzije: definicija funkcionalnosti i pristup njoj izvana i iz ove funkcionalnosti. Smatra se da su rekurziju rodili matematičari: faktorski proračun, beskonačni nizovi, fraktali, kontinuirani razlomci… Međutim, rekurzija se može naći svuda. Objektivni prirodni zakoni "smatraju" rekurziju kao svoj glavni algoritam i oblik izražavanja (egzistencije) ne toliko objekata materijalnog svijeta, koliko općenito glavnim algoritmom kretanja.
Ljudi različitih specijalnosti u raznim oblastima nauke i tehnologije koriste rekurzivni algoritam f (x), gdje je "x ~/=f (x)". Funkcija koja sama sebe poziva je jako rješenje, ali formiranje i razumijevanje ovog rješenja je, u većini slučajeva, vrlo težak zadatak.
U drevnim vremenima, rekurzija se koristila za povećanje prostora palate. Kroz sistem ogledala usmjerenih jedno na drugo, možete stvoriti zapanjujuće trodimenzionalne prostorne efekte. Ali da li je tako lako razumeti kakopodesiti ove retrovizore? Još je teže odrediti gdje se nalazi tačka u prostoru, reflektirana kroz nekoliko ogledala.
Rekurzivni, rekurzivni algoritmi: značenje i sintaksa
Problem, koji se formuliše ponavljanjem niza operacija, može se rešiti rekurzivno. Jednostavan algoritam (izračunavanje kvadratne jednačine, skripta za popunjavanje web stranice informacijama, čitanje datoteke, slanje poruke…) ne zahtijeva rekurziju.
Glavne razlike algoritma koji dozvoljava rekurzivno rješenje:
- postoji algoritam koji treba izvršiti nekoliko puta;
- algoritam treba podatke koji se mijenjaju svaki put;
- algoritam se ne mora mijenjati svaki put;
- postoji konačni uslov: algoritam je rekurzivan - nije beskonačan.
Uopšteno govoreći, ne može se tvrditi da je jednokratno izvršenje neophodan uslov za odsustvo razloga za rekurziju. Također ne možete zahtijevati obavezni konačni uslov: beskonačne rekurzije imaju svoj vlastiti opseg.
Algoritam je rekurzivan: kada se niz operacija izvodi više puta, na podacima koji se svaki put mijenjaju i svaki put daju novi rezultat.
Rekurzivna formula
Matematičko razumijevanje rekurzije i njenog analoga u programiranju su različiti. Matematika, iako postoje znaci programiranja, ali programiranje je matematika mnogo višeg reda.
Dobro napisan algoritam je poput ogledala intelekta svog autora. Generaleformula rekurzije u programiranju je "f(x)", gdje "x ~/=f(x)" ima najmanje dvije interpretacije. Ovdje je "~" sličnost ili odsustvo rezultata, a "=" prisustvo rezultata funkcije.
Prva opcija: dinamika podataka.
- funkcija "f(x)" ima rekurzivni i nepromjenjivi algoritam;
- "x" i rezultat "f(x)" imaju nove vrijednosti svaki put, rezultat "f(x)" je novi "x" parametar ove funkcije.
Druga opcija: dinamika koda.
- funkcija "f(x)" ima nekoliko algoritama koji preciziraju (analiziraju) podatke;
- analiza podataka - jedan dio koda i implementacija rekurzivnih algoritama koji izvode željenu akciju - drugi dio koda;
- rezultat funkcije "f(x)" nije.
Nijedan rezultat je normalan. Programiranje nije matematika, ovdje rezultat ne mora biti eksplicitno prisutan. Rekurzivna funkcija može jednostavno raščlaniti stranice i popuniti bazu podataka, ili instancirati objekte prema dolaznom ulazu.
Podaci i rekurzija
Programiranje rekurzivnih algoritama se ne odnosi na izračunavanje faktorijala, u kojem funkcija svaki put prima datu vrijednost koja je jedna više ili manja od jedan - opcija implementacije ovisi o preferencijama programera.
Nije bitno kako je faktorijel "8!",algoritam koji striktno slijedi ovu formulu.
Obrada informacija je "matematika" potpuno drugačijeg reda. Rekurzivne funkcije i algoritmi ovdje rade na slovima, riječima, frazama, rečenicama i paragrafima. Svaki sljedeći nivo koristi prethodni.
Ulazni tok podataka se analizira u širokom rasponu uslova, ali je proces analize generalno rekurzivan. Nema smisla pisati jedinstvene algoritme za sve varijante ulaznog toka. Trebalo bi da postoji jedna funkcionalnost. Ovdje su rekurzivni algoritmi primjeri kako se formira izlazni tok koji je adekvatan ulazu. Ovo nije izlaz rekurzivnog algoritma, ali je željeno i neophodno rješenje.
Apstrakcija, rekurzija i OOP
Objektno orijentirano programiranje (OOP) i rekurzija su fundamentalno različiti entiteti, ali se savršeno nadopunjuju. Apstrakcija nema nikakve veze sa rekurzijom, ali kroz sočivo OOP-a stvara mogućnost implementacije kontekstualne rekurzije.
Na primjer, informacije se raščlanjuju, a slova, riječi, fraze, rečenice i paragrafi se posebno naglašavaju. Očigledno, programer će obezbediti kreiranje instanci objekata ovih pet tipova i ponuditi rešenje rekurzivnih algoritama na svakom nivou.
U međuvremenu, ako na nivou slova “nema smisla tražiti značenje”, onda se semantika pojavljuje na nivou riječi. Možete podijeliti riječi na glagole, imenice, priloge, prijedloge… Možete ići dalje i definirati padeže.
Na nivou fraze, semantika je dopunjena znakovima interpunkcije i logikomkombinacije riječi. Na nivou rečenica nalazi se savršeniji nivo semantike, a pasus se može smatrati kompletnom mišlju.
Objektno orijentirani razvoj unaprijed određuje nasljeđivanje svojstava i metoda i predlaže da se započne hijerarhija objekata stvaranjem potpuno apstraktnog pretka. U isto vrijeme, bez sumnje, analiza svakog potomka će biti rekurzivna i neće se previše razlikovati na tehničkom nivou u mnogim pozicijama (slova, riječi, fraze i rečenice). Paragrafi, kao i potpune misli, mogu se izdvojiti sa ove liste, ali oni nisu suština.
Važno je da se najveći deo algoritma može formulisati na nivou apstraktnog pretka, prečišćavajući ga na nivou svakog potomka sa podacima i metodama pozvanim sa apstraktnog nivoa. U ovom kontekstu, apstrakcija otvara nove horizonte za rekurziju.
Istorijske karakteristike OOP
OOP je dva puta došao u svijet softvera, iako neki stručnjaci mogu izdvojiti pojavu cloud computinga i modernih ideja o objektima i klasama kao novu rundu u razvoju IT tehnologija.
Izrazi "objekt" i "objektiv" u modernom kontekstu OOP-a obično se pripisuju 50-im i 60-im godinama prošlog stoljeća, ali se povezuju sa 1965. i pojavom Simula, Lisp, Algol, Smalltalk.
U to vrijeme programiranje nije bilo posebno razvijeno i nije moglo adekvatno odgovoriti na revolucionarne koncepte. Borba ideja i stilova programiranja (C/C++ i Pascal - uglavnom) bila je još uvijek daleko, a baze podataka su još uvijek konceptualno formirane.
Kasnih 80-ih i ranih 90-ih, objekti su se pojavili u Pascal-u i svi su se sjećali klasa u C/C++ - ovo je označilo novi krug interesovanja za OOP i tada alati, prvenstveno programski jezici, nisu postali podržavaju samo objektno orijentirane ideje, ali se u skladu s tim razvijaju.
Naravno, ako su raniji rekurzivni algoritmi bili samo funkcije korištene u općem kodu programa, sada bi rekurzija mogla postati dio svojstava objekta (klase), što je pružalo zanimljive mogućnosti u kontekstu nasljeđivanja.
Obilježje modernog OOP-a
Razvoj OOP-a prvobitno je deklarisao objekte (klase) kao zbirke podataka i svojstava (metoda). U stvari, radilo se o podacima koji imaju sintaksu i značenje. Ali tada nije bilo moguće predstaviti OOP kao alat za upravljanje stvarnim objektima.
OOP je postao alat za upravljanje objektima "prirode računara". Skripta, dugme, stavka menija, traka menija, oznaka u prozoru pretraživača je objekat. Ali ne mašina, prehrambeni proizvod, riječ ili rečenica. Pravi objekti su ostali izvan objektno orijentisanog programiranja, a kompjuterski alati su dobili novu inkarnaciju.
Usled razlika u popularnim programskim jezicima, pojavili su se mnogi dijalekti OOP-a. U semantičkom smislu, oni su praktično ekvivalentni, a njihov fokus na instrumentalnu sferu, a ne na primijenjenu, omogućava da se opis stvarnih objekata odvede dalje odalgoritme i osigurati njihovo "postojanje" na različitim platformama i na više jezika.
Stokovi i mehanizmi poziva funkcija
Mehanizmi za pozivanje funkcija (procedure, algoritmi) zahtijevaju prosljeđivanje podataka (parametara), vraćanje rezultata i pamćenje adrese operatera koji mora primiti kontrolu nakon što se funkcija (procedura) završi.
Obično se stek koristi za ovu svrhu, iako programski jezici ili sam programer mogu pružiti razne opcije za prijenos kontrole. Moderno programiranje priznaje da ime funkcije može biti ne samo parametar: može se formirati tokom izvršavanja algoritma. Algoritam se također može kreirati dok se izvršava drugi algoritam.
Koncept rekurzivnih algoritama, kada se njihova imena i tijela mogu odrediti u trenutku formiranja zadatka (odabir željenog algoritma), proširuje rekurzivnost ne samo na to kako nešto učiniti, već i na to ko tačno treba učini to. Odabir algoritma po njegovom "smislenom" imenu obećava, ali stvara poteškoće.
Rekurzivnost na skupu funkcija
Ne možete reći da je algoritam rekurzivan kada sam sebe pozove i to je to. Programiranje nije dogma, a koncept rekurzivnosti nije isključivi zahtjev za pozivanje sebe iz tijela vlastitog algoritma.
Praktične primjene ne daju uvijek čisto rješenje. Često se početni podaci moraju pripremiti, a rezultat rekurzivnog poziva analizirati u kontekstu cjelokupnog problema (cijelog algoritma) uukupno.
U stvari, ne samo prije nego što se pozove rekurzivna funkcija, već i nakon što je završena, drugi program može ili treba biti pozvan. Ako nema posebnih problema s pozivom: rekurzivna funkcija A() poziva funkciju B(), koja nešto radi i poziva A(), tada odmah dolazi do problema s vraćanjem kontrole. Nakon što završi rekurzivni poziv, funkcija A() mora primiti kontrolu da bi ponovo pozvala B(), koji će je ponovo pozvati. Vraćanje kontrole kako bi trebalo da bude na steku nazad na B() je pogrešno rješenje.
Programer nije ograničen u izboru parametara i može ih dopuniti nazivima funkcija. Drugim riječima, idealno rješenje je proslijediti ime B() u A() i dozvoliti da A() sam pozove B(). U ovom slučaju neće biti problema sa vraćanjem kontrole, a implementacija rekurzivnog algoritma će biti transparentnija.
Razumijevanje i nivo rekurzije
Problem sa razvojem rekurzivnih algoritama je taj što morate razumjeti dinamiku procesa. Kada se koristi rekurzija u objektnim metodama, posebno na nivou apstraktnog pretka, postoji problem razumijevanja vlastitog algoritma u kontekstu njegovog vremena izvršenja.
Trenutno ne postoje ograničenja u pogledu nivoa ugniježđenja funkcija i kapaciteta steka u mehanizmima poziva, ali postoji problem razumijevanja: u kom trenutku koji nivo podataka ili koje mjesto u općem algoritmu se zove rekurzivni funkciju i na kojem broju poziva sama.
Postojeći alati za otklanjanje grešaka su često nemoćnireci programeru pravo rješenje.
Petlje i rekurzija
Smatra se da je cikličko izvršenje ekvivalentno rekurziji. Zaista, u nekim slučajevima, rekurzivni algoritam se može implementirati u sintaksi uslovnih i cikličkih konstrukcija.
Međutim, ako postoji jasno razumijevanje da se određena funkcija mora implementirati kroz rekurzivni algoritam, svaka eksterna upotreba petlje ili uvjetnih izraza treba biti napuštena.
Ovdje znači da će rekurzivno rješenje u obliku funkcije koja sama sebe koristi biti potpun, funkcionalno potpun algoritam. Ovaj algoritam će zahtijevati od programera da ga kreira s naporom, razumijevajući dinamiku algoritma, ali će to biti konačno rješenje koje ne zahtijeva eksternu kontrolu.
Bilo koja kombinacija eksternih uslovnih i cikličkih operatora nam neće dozvoliti da rekurzivni algoritam predstavimo kao kompletnu funkciju.
Rekurzivni konsenzus i OOP
U skoro svim varijantama razvoja rekurzivnog algoritma, nameće se plan razvoja dva algoritma. Prvi algoritam generiše listu budućih objekata (instanci), a drugi algoritam je zapravo rekurzivna funkcija.
Najbolje rješenje bi bilo urediti rekurziju kao jedno svojstvo (metod) koje zapravo sadrži rekurzivni algoritam i staviti sav pripremni rad u konstruktor objekata.
Rekurzivni algoritam će biti pravo rješenje samo kada radisamo sam, bez vanjske kontrole i upravljanja. Eksterni algoritam može dati samo signal za rad. Rezultat ovog rada bi trebao biti očekivano rješenje, bez vanjske podrške.
Rekurzija bi uvijek trebala biti potpuno samostalno rješenje.
Intuitivno razumijevanje i funkcionalna potpunost
Kada je objektno orijentisano programiranje postalo de facto standard, postalo je očigledno da, da biste efikasno kodirali, morate promijeniti vlastito razmišljanje. Programer mora preći sa sintakse i semantike jezika na dinamiku semantike tokom izvršavanja algoritma.
Karakteristika rekurzije: može se primijeniti na sve:
- web scraping;
- operacije pretraživanja;
- parsing tekstualne informacije;
- čitanje ili kreiranje MS Word dokumenata;
- uzorkovanje ili analiza oznaka…
Karakteristika OOP-a: omogućava da se opiše rekurzivni algoritam na nivou apstraktnog pretka, ali omogućava da se odnosi na jedinstvene potomke, od kojih svaki ima svoju paletu podataka i svojstava.
Rekurzija je idealna jer zahtijeva funkcionalnu potpunost svog algoritma. OOP poboljšava performanse rekurzivnog algoritma dajući mu pristup svoj jedinstvenoj djeci.