Što je rekurzivni poziv?

U programiranju, rekurzivni poziv je naredba unutar potprograma ili funkcije koja govori programu da ponovno pokrene isti potprogram. Izvedba ponavljanja može biti izravan rezultat funkcije ili se može pokrenuti druga funkcija koja se opet odnosi na prvu funkciju. Rekurzivni poziv ima neke sličnosti s strašnom beskonačnom petljom, ali potprogram uvijek ima uvjetnu izjavu koja govori programu kada treba prestati ponavljati rekurziju.

Koncept rekurzije možda je najbolje ilustrirati korištenjem primjera. Pretpostavimo da krovopokrivač postavlja nove šindre na dom. Za početak, mora nositi snop šindre na krov. Nakon što zabije prvi snop na mjesto, mora se spustiti niz ljestve, dohvatiti drugi snop i zabiti ga na mjesto. Proces se nastavlja kao niz “idi, dohvati, vrati” sve dok se ne nanese posljednja šindra. U tom trenutku krovopokrivač može slobodno prijeći na sljedeći posao ili otići kući.

Iako je primjer pretjerano pojednostavljen, sadrži sve elemente rekurzivnog poziva. Postoji početna točka, krovopokrivač mora dohvatiti ono što mu treba, vratiti se na početak i, kada se ispuni konačni uvjet, stati. To je u osnovi ono što program radi; počinje, provodi radnju, vraća se samome sebi i završava kada nastupi krajnji uvjet.

Završni uvjet se naziva osnovni slučaj. Neophodan je za sve rekurzivne pozive; bez toga bi se funkcija nastavila ponavljati. U najboljem slučaju, to rezultira iscrpljivanjem memorijskih resursa sustava. Obično će preopterećenje u nekom trenutku srušiti program, ali do trenutka kada se problem otkrije, može doći do značajne štete.

Iskusni programeri mogli bi prepoznati sličnost između rekurzivnog poziva i petlje “for” ili “while”. Ako je, na primjer, cilj pronaći ukupan broj zaliha svih zaliha s brojevima dijelova većim od 999, petlja “for” govori programu da locira sve kvalificirajuće instance, a petlja “while” govori programu da izvrši petlju samo dok vrijedi navedeni uvjet. Moglo bi se reći da rekurzivni poziv kombinira neke od značajki ovih petlji s naredbom “ako-onda-drugo”; ako je ovaj uvjet istinit, učinite ovo, ili učinite nešto drugačije ako je uvjet lažan. Rekurzija obično dopušta kompaktniji kod, međutim, i omogućuje da se problem prenese funkciji bliže točki koja je potrebna.