Mikä on Tail Recursion?

Tietokoneohjelmoinnissa hännän rekursio on hännän puhelun käyttö rekursiivisen toiminnon suorittamiseksi. Takaisinpuhelu on, kun toimintoa kutsutaan toisen toiminnon viimeiseksi teokseksi. Esimerkiksi tässä JavaScript-ohjelmassa:

 var myTailFunc = toiminto (myVar) {palaa myVar; }; var myFunc = toiminto (myVar) {return myTailFunc (myVar); }; 

Tässä puhelu myTailFunc (myVar) on hännän puhelu, koska se on viimeinen myFunc (myVar) -toiminto . Kun kääntäjä näkee, että se on myFuncin viimeinen toiminta, se voi suorittaa pienen optimoinnin. Pohjimmiltaan sen ei tarvitse painaa paluuosoitetta pinoon, koska sen ei tarvitse palata myFunciin . Se voi palauttaa myTailFuncin palautusarvon myFuncin palautusarvona .

Tämä pieni optimointi tulee merkittävämmäksi, kun sitä käytetään rekursiivisessa toiminnossa. Normaalisti jokainen rekursiotaso edellyttäisi, että pinoon työnnetään ylimääräinen palautusosoite. Tail-rekursio tekee tämän tarpeettomaksi.

Tässä on esimerkki yksinkertaisesta JavaScript-tekijäfunktiosta, joka on kirjoitettu ensin ilman häntä ja sitten hännän rekursiota.

Faktaalifunktio ilman hännän rekursiota

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

Tämä toiminto on rekursiivinen, mutta ei rekursiivinen. Toiminnon viimeinen prosessi on kertomistoiminto (" * "), joten rekursio täytyy aina palata soittotoimintoon.

Faktaalitoiminto, jossa on hännän rekursio

 var factorial = toiminto (n) {var recursion = toiminto (n, subTotal) {if (n == 0) {paluuosio yhteensä; } else {return recursion (n - 1, n * subTotal); }}; paluu-rekursio (n, 1); }; 

Toiminto, ohjelmointitermit