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