U ovom vodiču ćemo vidjeti Rekurzija s primjerima u Pythonu. Rekurzija u programiranju je vrlo moćna tehnika, radi se s funkcijama koje se same pozivaju, vide je kao svojevrsnu petlju, budući da će se isti kod ponavljati nekoliko puta, sve dok se ne dođe do rješenja.
Karakteristike koje rekurzivna funkcija mora imatiOsnovni slučajOmogućit će nam da u nekom trenutku prekinemo funkciju i da se ne javljaju beskonačni pozivi.
Rekurzivni slučajU ovom slučaju ponovno pozivamo funkciju, ali ćemo se približiti rješenju. U primjerima će izgledati bolje.
BilješkaVažno je biti jasan u vezi s osnovnim slučajem i znati da mu se rekurzivni slučaj sve više približava i ne ulazi u stanje beskonačnih poziva, to je česta pogreška pri početku s rekurzijom.
Prijeđimo na primjere koji će biti jednostavni i kratki kako bi se mogli dobro usvojiti.
Primjer 1 - faktorski
U ovom primjeru ćemo riješiti faktorijel brojaAko želite znati o čemu se radi u faktoriju, posjetite ovu vezu. Ovdje je kôd, a ispod objašnjavam rekurzivnu funkciju.
def factorial (number): if (number == 0 or number == 1): return 1 else: return number * factorial (number-1) if __name__ == "__main__": try: num = int (input ("Od Za koji broj želite znati faktorijel? ")) If (num <0): print (" Broj mora biti veći ili jednak 0 ") else: print (" Faktor od ", num," is ", factorial (num)) osim: print (" Očekuje se broj ")Naša rekurzivna funkcija ima osnovni slučaj u if, a rekurzivna u else. Možete vidjeti da osnovni slučaj vraća 1 i da je to postignuto kada je parametar proslijeđen funkciji 0 ili 1, kada je ovaj slučaj dosegnut, funkcija se više ne poziva. U rekurzivnom slučaju imamo poziv same funkcije, ali kako vidite smanjenje parametra za 1 (približavamo se osnovnom slučaju). Posljednji dio koda izvan funkcije odgovoran je samo za traženje broja od korisnika i provjeru je li za pozivanje funkcije veći ili jednak 0, budući da faktorijal s negativnim brojevima ne radi.
Pozovemo li funkciju s brojem 4, odnosno faktorijelom (4), imamo sljedeće pozive:
Poziv 1: faktorski (4) Poziv 2: 4 * faktorski (3) Poziv 3: 3 * faktorski (2) Poziv 4: 2 * faktorski (1)Kada zovete factorial s 1, nema više poziva i vratit će 1, tada ova funkcija vraća rezultate vraćajući funkciji koju ja zovem, povrat bi bio ovakav:
faktorski (1) = 1 faktorski (2) = 2 * 1 faktorski (3) = 3 * 2 faktorski (4) = 4 * 6I već imamo naš rezultat, koji je 24, od množenja brojeva: 1 * 2 * 3 * 4. Zatim ostavljam snimak zaslona kada tražim faktorijel od 5, što nije ništa drugo nego množenje 5 s faktorijelom 4 (za koje već znamo da je 24) dajući kao rezultat 120. Također možete vidjeti da ako korisnik unese broj pogrešno, to je:
Primjer 2 - zbrajanje / oduzimanje
U ovom primjeru stavljam rekurzivnu funkciju za zbrajanje ili oduzimanje, naravno da se ovaj primjer obično ne pojavljuje u stvarnom životu, ali kao primjer funkcionira:
def operacija (broj1, broj2): if (broj2 == 0): povratak broj1 elif (broj2 <0): povratak operacija (broj1-1, broj2 + 1) inače: povratak operacija (broj1 + 1, broj2-1) ako __name__ == "__main__": print ("Dodavanje 10 i 3:", operacija (10, 3)) ispis ("Dodavanje 5 i -2:", upravljanje (5, -2))Ovdje imamo osnovni slučaj i 2 rekurzivna slučaja, ovo je da znamo koji način trebamo dodirnuti, jer ćemo ovisno o tome je li broj pozitivan ili negativan morati postupiti drugačije. Operacijska funkcija prima 2 broja, a algoritam će se pobrinuti za oduzimanje ili zbrajanje jednog broju 2 i njegovo prosljeđivanje broju 1 (Ako je broj 2 pozitivan, oduzimam 1 od broja 2 i dodajem ga broju 1), tako da dok varijabla broj 2 nije jednaka do 0.
Na primjer, mi ćemo dodati 3 + 2 gledajući pozive.
Poziv 1: rad (3,2) Poziv 2: rad (4,1) Poziv 3: rad (5,0)U ovom slučaju, kada operiramo (5,0), nema se što drugo učiniti, imamo rezultat izravno (za razliku od slučaja s faktorijelom koji je morao izvršiti množenje). Evo rezultata izvršavanja koda:
BilješkaIako s rekurzijom imamo elegantno rješenje i obično kraće, trebalo bi ga koristiti kad nemamo drugu opciju, ako ga možemo povući svojom iterativnom varijantom, to će biti bolji izbor, jer troši manje memorije i obično je brži.
Je li vam se svidio i pomogao ovaj vodič?Autor možete nagraditi pritiskom na ovaj gumb kako biste mu dali pozitivan bod