Što je rep repurzija?

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