Kas yra uodegos rekursija?

Kompiuterių programavimo metu uodegos rekursija yra uodegos skambučio panaudojimas rekursijos funkcijos vykdymui. Užpakalinis skambutis yra tai, kai funkcija vadinama paskutiniu kito funkcijos veiksmu. Pavyzdžiui, šioje „JavaScript“ programoje:

 var myTailFunc = funkcija (myVar) {grąžinti myVar; }; var myFunc = funkcija (myVar) {return myTailFunc (myVar); }; 

Čia skambinimas į myTailFunc (myVar) yra uodegos skambutis, nes jis yra paskutinis „ myFunc“ (myVar) veikimas . Kai kompiliatorius mato, kad tai yra galutinis „ myFunc“ veikimas, jis gali atlikti nedidelį optimizavimą. Iš esmės, jam nereikia stumti grįžtamojo adreso, nes jam nereikės grįžti į myFunc . Ji gali grąžinti myTailFunc grąžinimo vertę kaip grįžimo vertę.

Šis mažas optimizavimas tampa reikšmingesnis, kai naudojamas rekursyvioje funkcijoje. Paprastai kiekvienam rekursijos lygiui reikalingas papildomas grąžinimo adresas, kuris turi būti stumiamas ant kamino. Uodegos rekursija daro tai nereikalinga.

Čia pateikiamas paprasto „JavaScript“ faktoriaus funkcijos, parašytos pirmiausia be uodegos rekursijos, pavyzdys.

Faktinė funkcija be uodegos rekursijos

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

Ši funkcija yra rekursyvi, bet ne uodega. Galutinis funkcijos procesas yra dauginimo operacija (" * "), todėl rekursija visada turės grįžti į skambinimo funkciją.

Faktinė funkcija su uodegos rekursija

 var factorial = funkcija (n) {var recursion = funkcija (n, subTotal) {if (n == 0) {grįžti subTotal; } other {return recursion (n - 1, n * subTotal); }}; grąžinimo rekursija (n, 1); }; 

Funkcija, programavimo sąlygos