Co je Tail Recursion?

V počítačovém programování, rekurze ocasu je použití ocasního volání vykonávat rekurzivní funkci. Ocasní volání je, když je funkce nazývána jako poslední akt jiné funkce. Například v tomto programu JavaScript:

 var myTailFunc = funkce (myVar) {return myVar; }; var myFunc = funkce (myVar) {return myTailFunc (myVar); }; 

Zde je volání myTailFunc (myVar) ocasní hovor, protože se jedná o poslední operaci myFunc (myVar) . Když kompilátor vidí, že se jedná o poslední operaci myFunc, může provést malou optimalizaci. V zásadě není třeba vracet adresu do zásobníku, protože se nebude muset vrátit do myFunc . Může vrátit návratovou hodnotu myTailFunc jako návratovou hodnotu myFunc .

Tato malá optimalizace se stává významnější při použití v rekurzivní funkci. Normálně by každá úroveň rekurze vyžadovala, aby byla do zásobníku přidána další zpáteční adresa. Rekonstrukce ocasu to činí zbytečným.

Zde je příklad jednoduché JavaScriptové faktorové funkce, která byla napsána jako první, a pak s rekurzí ocasu.

Faktoriální funkce bez rekurze ocasu

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

Tato funkce je rekurzivní, ale ne ocas rekurzivní. Konečný proces funkce je násobení operace (“ * ”), tak rekurze bude vždy muset vrátit se k volající funkci.

Faktoriální funkce s rekurzí ocasu

 var factorial = funkce (n) {var rekurze = funkce (n, subTotal) {if (n == 0) {return subTotal; } else {návratová rekurze (n - 1, n * subTotal); }}; návratová rekurze (n, 1); }; 

Funkce, programovací termíny