U računalnom programiranju repurzija repa je uporaba repnog poziva za izvođenje rekurzivne funkcije. Poziv repa je kada se funkcija nazove kao posljednji čin druge funkcije. Na primjer, u ovom JavaScript programu:
var myTailFunc = funkcija (myVar) {vratiti myVar; }; var myFunc = funkcija (myVar) {povratak myTailFunc (myVar); };
Ovdje je poziv na myTailFunc (myVar) rep poziv jer je to posljednja operacija myFunc (myVar) . Kada kompajler vidi da je to posljednja operacija myFunc, može izvesti malu optimizaciju. U osnovi, ne treba gurati povratnu adresu na stog, jer se neće morati vraćati na myFunc . Može vratiti povratnu vrijednost myTailFunc kao povratnu vrijednost myFunc .
Ova mala optimizacija postaje značajnija kada se koristi u rekurzivnoj funkciji. Obično bi svaka razina rekurzije zahtijevala dodatnu povratnu adresu koja bi se gurnula u stog. Rekurzija repa čini ovo nepotrebnim.
Evo primjera jednostavne JavaScript faktorske funkcije napisane prvo bez rekurzije repa.
Faktorska funkcija bez rekurzije repa
var factorial = funkcija (n) {if (n == 0) {return 1; } else {return n * faktorijalno (n - 1); }};
Ova funkcija je rekurzivna, ali ne i rekurzivna. Završni proces funkcije je operacija množenja (" * "), tako da će se rekurzija uvijek trebati vratiti na funkciju pozivanja.
Faktorska funkcija s repurzijom repa
var factorial = funkcija (n) {var recursion = funkcija (n, subTotal) {if (n == 0) {povratni subtotal; } else {povratna rekurzija (n - 1, n * subTotal); }}; povratna rekurzija (n, 1); };
Funkcija, programski izrazi