Kaj je repuracija repa?

V računalniškem programiranju je repurzija repa uporaba repnega klica za izvedbo rekurzivne funkcije. Zadnji klic je, ko je funkcija klicana kot zadnje dejanje druge funkcije. Na primer, v tem programu JavaScript:

 var myTailFunc = funkcija (myVar) {vrne myVar; }; var myFunc = funkcija (myVar) {return myTailFunc (myVar); }; 

Tukaj je klic myTailFunc (myVar) rep, ker je zadnja operacija myFunc (myVar) . Ko prevajalnik vidi, da je končna operacija myFunc, lahko izvede majhno optimizacijo. V bistvu ni treba potiskati povratnega naslova na sklad, ker se ne bo treba vrniti na myFunc . Vrne vrednost myTailFunc kot vrnjeno vrednost myFunc .

Ta majhna optimizacija postane pomembnejša, če jo uporabljamo v rekurzivni funkciji. Običajno bi vsaka stopnja rekurzije zahtevala dodaten povratni naslov, ki bi ga potisnili na sklad. Rekurzija repa je to nepotrebno.

Tukaj je primer preproste JavaScript faktorske funkcije, napisane najprej brez, in nato z repurzijo repa.

Faktorska funkcija brez rekurzije repa

 var factorial = funkcija (n) {if (n == 0) {return 1; } else {return n * faktorial (n - 1); }}; 

Ta funkcija je rekurzivna, vendar ne rekurzivna. Končni postopek funkcije je operacija množenja (" * "), zato se bo rekurzija vedno morala vrniti k klicni funkciji.

Faktorska funkcija z repurzijo repa

 var factorial = funkcija (n) {var recursion = funkcija (n, subTotal) {if (n == 0) {vrne subTotal; } else {povratna rekurzija (n - 1, n * subTotal); }}; povratna rekurzija (n, 1); }; 

Funkcija, programski izrazi