Koncová rekurze: Porovnání verzí

Smazaný obsah Přidaný obsah
JackieBot (diskuse | příspěvky)
m r2.7.2) (Robot: Upravuji en:Tail call
Formátování, typos
Řádek 1:
'''Koncová rekurze''', respektive '''koncové volání''', je v [[Informatika (počítačová věda)|informatice]] taková situace, kdy posledním příkazem [[Funkce (programování)|funkce]] je [[rekurzivní funkce (programování)|rekurzivní]] zavolání sebe sama, respektive jiné funkce. Takové volání může šetřit místo na [[zásobník volání|zásobníku volání]], pokud to [[překladač]] umožňuje. Při předání řízení do podprogramu je totiž možná nahradit obsah rámce současného podprogramu (z něhož už většina informací nebude potřeba) novým obsahem a předat řízení na začátek podprogramu obyčejným [[skok (informatika)|skok]]em, místo aby se musel starý rámec zachovávat a na vrchol zásobníku navíc ukládat rámec nový.
 
Z hlediska běžného [[procedurální programování|procedurálního programování]] je chytrá úprava koncových volání určitou [[Optimalizace (informatika)|optimalizací]] umožňující hlubší „zanoření“ při rekurzi. Naproti tomu ve [[Funkcionální programování|funkcionálníchfunkcionálním programování]], kde je místo [[cyklus (programování)|cyklů]] obvyklé používat [[rekurze|rekurzi]], je obvykle chytrý překlad koncových volání zaručen standardy daného jazyka (například ve [[Scheme]]). Hluboké rekurzivní zanoření je totiž předpokladem fungování programů a tedy není považováno za optimalizaci, ale za nezbytnou součást překladače.
 
== Příklady syntaxe ==
Koncové volání může být umístěnaumístěno zkrátka na úplném konci funkce, například v následující ukázce:
<source lang="javascript">
function foo(data) {
Řádek 11:
}
</source>
Jeje volání funkce <code>b</code> koncovým voláním, zatímco volání funkce <code>a</code> není koncovým voláním.

Funkce ovšem může obsahovat i více koncových volání než jedno – podstatné je, že za koncovým voláním následuje návrat z podprogramu. Například v zdrojovém kódu:
<source lang="javascript">
function bar(data) {