Kaj je rekurzivni klic?

Pri programiranju je rekurzivni klic ukaz znotraj podprograma ali funkcije, ki programu pove, naj znova zažene isti podprogram. Ponavljanje delovanja je lahko neposreden rezultat funkcije ali pa se lahko sproži druga funkcija, ki se po drugi strani nanaša nazaj na prvo funkcijo. Rekurzivni klic ima nekaj podobnosti z grozljivo neskončno zanko, vendar ima podprogram vedno pogojni stavek, ki programu pove, kdaj naj preneha ponavljati rekurzijo.

Koncept rekurzije je morda najbolje ponazoriti z uporabo primera. Recimo, da krovec na dom polaga nove skodle. Za začetek mora na streho nositi snop skodle. Ko zabije prvi snop na mesto, se mora splezati po lestvi, vzeti še en snop in ga pribiti na mesto. Postopek se nadaljuje kot serija “pojdi, prinesi, vrni se”, dokler ni nanesena zadnja skodle. Takrat lahko krovec preide na naslednje delo ali gre domov.

Čeprav je primer pretirano poenostavljen, vsebuje vse elemente rekurzivnega klica. Obstaja izhodišče, krovec mora pridobiti, kar potrebuje, se vrniti na začetek in se, ko je končni pogoj izpolnjen, ustaviti. To v bistvu počne program; začne, izvaja dejanje, se vrne vase in konča, ko nastopi končni pogoj.

Končni pogoj se imenuje osnovni primer. Bistvena je za vse rekurzivne klice; brez tega bi se funkcija še naprej ponavljala. V najboljšem primeru to povzroči izčrpavanje sistemskih pomnilniških virov. Običajno bo preobremenitev na neki točki zrušila program, toda do trenutka, ko je težava odkrita, lahko povzroči znatno škodo.

Izkušeni programerji lahko prepoznajo podobnost med rekurzivnim klicem in zanko »za« ali »while«. Če je na primer cilj najti skupno število zalog vseh zalog s številkami delov, večjimi od 999, zanka “for” pove programu, naj poišče vse kvalificirane primere, zanka “while” pa pove programu, da izvede zanko. samo dokler velja navedeni pogoj. Za rekurzivni klic bi lahko rekli, da združuje nekatere značilnosti teh zank s stavkom »če-potem-else«; če je ta pogoj resničen, naredite to, ali pa naredite nekaj drugega, če je pogoj napačen. Rekurzija pa običajno omogoča bolj kompaktno kodo in omogoča, da se problem prenese na funkcijo bližje točki, ki jo potrebuje.