În programare, un apel recursiv este o comandă dintr-o subrutină sau o funcție care îi spune programului să ruleze din nou aceeași subrutină. Performanța repetată poate fi rezultatul direct al funcției sau poate fi declanșată o a doua funcție care, la rândul său, se referă la prima funcție. Un apel recursiv are unele asemănări cu temuta buclă infinită, dar subrutina are întotdeauna o declarație condiționată care spune programului când să nu mai repete recursiunea.
Conceptul de recursivitate este poate cel mai bine ilustrat prin utilizarea unui exemplu. Să presupunem că un acoperiș aplică șindrilă nouă pe o casă. Pentru a începe, trebuie să ducă un mănunchi de șindrilă pe acoperiș. Odată ce a prins primul pachet în cuie, trebuie să coboare pe scară, să recupereze un alt pachet și să-l închidă în cuie. Procesul continuă ca o serie de „du-te, adu, întoarce” până când ultima șindrilă a fost aplicată. În acel moment, acoperișul este liber să treacă la următorul loc de muncă sau să plece acasă.
Deși exemplul este o simplificare excesivă, conține toate elementele unui apel recursiv. Există un punct de plecare, acoperișul trebuie să recupereze ceea ce are nevoie, să revină la început și, când condiția finală este îndeplinită, să se oprească. Acest lucru este în principiu ceea ce face programul; începe, implementează o acțiune, revine în sine și se termină atunci când apare condiția de sfârșit.
Condiția finală este denumită cazul de bază. Este esențial pentru toate apelurile recursive; fără ea, funcția s-ar repeta în continuare. În cel mai bun caz, acest lucru duce la epuizarea resurselor de memorie ale sistemului. În mod normal, supraîncărcarea va bloca programul la un moment dat, dar în momentul în care problema este descoperită, se pot produce daune semnificative.
Programatorii cu experiență ar putea recunoaște asemănarea dintre un apel recursiv și o buclă „for” sau „while”. Dacă, de exemplu, scopul este de a găsi numărul total de stocuri pentru toate stocurile cu numere de piese mai mari de 999, o buclă „for” îi spune programului să localizeze toate cazurile de calificare, iar o buclă „while” îi spune programului să execute bucla. numai în timp ce condiția enunțată este valabilă. Se poate spune că un apel recursiv combină unele dintre caracteristicile acestor bucle cu o declarație „dacă-atunci-altfel”; dacă această condiție este adevărată, atunci faceți acest lucru, sau faceți ceva diferit dacă condiția este falsă. Cu toate acestea, recursiunea permite de obicei un cod mai compact și permite ca problema să fie transmisă funcției mai aproape de punctul de care este nevoie.