În programarea computerelor, un apel de coadă este o situație specifică din codul sursă al programului în care o funcție, subrutină sau procedură returnează o valoare așteptată apelând o altă funcție în loc să transmită pur și simplu o variabilă care deține valoarea returnată. Numele în sine indică faptul că funcția apelată pentru a calcula valoarea care trebuie returnată se află la sfârșitul sau coada funcției care o apelează pentru a furniza o valoare returnată. Un apel de coadă este de interes pentru unii programatori deoarece, cu anumite optimizări sau comportamente ale compilatorului, nu este folosit spațiu suplimentar de stivă pentru a stoca locațiile de cod ale funcției principale; funcția de coadă este folosită în schimb pentru a genera rapoarte de valoare returnată direct înapoi la punctul de apel unde a fost invocată funcția inițială. Utilizarea unui apel de coadă este deosebit de utilă în situațiile în care recursiunea este folosită, deoarece cantitatea de spațiu de stivă folosită pentru a stoca adresele apelantului în cazurile în care apelurile recursive se cuibăresc foarte adânc ar putea să se epuizeze rapid și să oprească execuția programului. Deși folosirea apelurilor de coadă poate ajuta la creșterea vitezei, a utilizării memoriei și a eficienței într-un program, poate duce, de asemenea, la situații în care codul sursă este restructurat pentru a utiliza apelurile într-un mod care face dificilă depanarea și urmărirea, în special în cazurile de recursiunea.
Existența unui apel de coadă se datorează în mare parte modului în care funcționează stiva de apeluri în majoritatea programelor de calculator și arhitecturilor de sistem. Stiva, care este ca un teanc de plăci, este o structură de date primul intrat, ultimul ieșit. Când este apelată o funcție, subrutină sau procedură, adresa de la care se efectuează apelul, numită cadru stivă, este stocată în stivă. Aceasta înseamnă că un program care apelează Funcția A, care apoi apelează Funcția B, va avea două cadre de stivă, unul pentru Funcția B și altul dedesubt pentru Funcția A. După ce funcția B se termină de execuție, cadrul său de stivă este scos din partea de sus a stiva și execuția revine la Funcția A, care are cadrul său scos din stivă atunci când este gata, revenind în cele din urmă controlul programului la punctul de la care prima funcție a fost inițial apelată.
Când se utilizează un apel de coadă, instrucțiunea return într-o funcție folosește direct valoarea returnată a unei alte funcții ca date care trebuie trimise la codul de apelare. În exemplul de mai sus, dacă Funcția A apelează Funcția B direct cu instrucțiunea return, atunci a fost format un apel de coadă. În cadrul stivei de apeluri, în loc să aibă un cadru de stivă pentru ambele funcții A și B, Funcția B va primi adresa de retur de la Funcția A, iar cadrul de stivă al funcției A va fi scos și eliminat, ceea ce înseamnă că Funcția B va transmite valoarea returnată direct înapoi. la locația care a apelat Funcția A fără a fi nevoie mai întâi de a trece controlul înapoi la Funcția A. Acest lucru crește viteza apelurilor de funcții și ajută la menținerea cantității de informații din stivă.
Proprietățile unui apel de coadă le pot face o opțiune foarte atractivă pentru funcțiile recursive. O funcție recursivă este una care se autoapelează în mod repetat pentru a calcula o valoare, așa cum poate fi cazul când parcurgeți o structură de date de listă. Nu sunt create cadre suplimentare de stivă pentru apelurile de funcții imbricate, astfel încât niveluri foarte profunde de recursivitate pot fi efectuate în siguranță, fără amenințarea imediată a unui depășire a stivei și a posibilei terminații de program.