Programování
Rekurze
Rekurze je programovací technika, při níž je určitá procedura nebo funkce znovu volána dříve, než je dokončeno její předchozí volání.
Použití rekurze může u některých úloh vést ke stručnému a matematicky elegantnímu řešení. Nevede ale nutně k řešení optimálnímu. Použití rekurze vede obvykle k jinému rozložení využití prostředků přidělených programu operačním systémem, případně k jejich rychlejšímu vyčerpání, proto se při optimalizaci programu většinou snažíme rekurzi omezit nebo odstranit.
Rekurzi nepoužíváme pro úlohy, které jdou snadno vyřešit prostým cyklem.
Některé (zejména starší) programovací jazyky a některé překladače rekurzi neumožňují; jiné vyžadují, aby programátor explicitně uvedl, že je daná procedura nebo funkce rekurzivní.
Řadu rekurzívních algoritmů lze nahradit iteračními, které počítají výsledek „zdola nahoru“, tj, od menších (jednodušších) dat k větším (složitějším)
Vše co jde napsat rekurzivně, jde i iterativně !
Výhodou rekurzivních funkcí (procedur) je jednoduchost a přehlednost
Nevýhodou může být časová náročnost způsobená např. zbytečným opakováním výpočtu
Použití rekurze může u některých úloh vést ke stručnému a matematicky elegantnímu řešení. Nevede ale nutně k řešení optimálnímu. Použití rekurze vede obvykle k jinému rozložení využití prostředků přidělených programu operačním systémem, případně k jejich rychlejšímu vyčerpání, proto se při optimalizaci programu většinou snažíme rekurzi omezit nebo odstranit.
Rekurzi nepoužíváme pro úlohy, které jdou snadno vyřešit prostým cyklem.
Některé (zejména starší) programovací jazyky a některé překladače rekurzi neumožňují; jiné vyžadují, aby programátor explicitně uvedl, že je daná procedura nebo funkce rekurzivní.
Řadu rekurzívních algoritmů lze nahradit iteračními, které počítají výsledek „zdola nahoru“, tj, od menších (jednodušších) dat k větším (složitějším)
Vše co jde napsat rekurzivně, jde i iterativně !
Výhodou rekurzivních funkcí (procedur) je jednoduchost a přehlednost
Nevýhodou může být časová náročnost způsobená např. zbytečným opakováním výpočtu
Více informací: Wikipedia
Terminologie
Volání může probíhat přímo nebo nepřímo:
Podprogram může být volán jednou nebo vícekrát:
- Přímá rekurze nastává, když podprogram volá přímo sám sebe.
- Nepřímá rekurze je situace, kdy vzájemné volání podprogramů vytvoří „kruh“. Např. ve funkci A se volá funkce B a ve funkci B se volá opět funkce A.
Podprogram může být volán jednou nebo vícekrát:
- Lineární rekurze nastává, pokud podprogram při vykonávání svého úkolu volá sama sebe pouze jednou. Vytváří se takto lineární struktura postupně volaných podprogramů.
- Stromová rekurze nastává, pokud se funkce nebo procedura v rámci jednoho vykonání svého úkolu vyvolá vícekrát. Strukturu volání je možné znázornit jako zakořeněný strom . Pro dvě volání v jednom průchodu vzniká binární strom , pro tři ternární strom, atd. (Počet rekurzivních volání nemusí být konstantní, např. při rekurzivním procházení grafu voláme zpracování na všechny sousedy vrcholu, a těch je obecně různý počet.)
Binární strom
Zakořeněný strom (stromový graf)
Základní kroky
Program, který používá rekurzivní volání, obvykle provádí tyto kroky:
- Kontrola
- Inicializace
- Vlastní rekurze
- Rozdělení problému na dílčí podproblémy.
- Zavolání funkcí, které řeší daný podproblém (tady nastává přímé nebo nepřímé volání sebe sama).
- Sestavení výsledku.
- Vrácení výsledku.
Algoritmy
V oblasti algoritmů můžeme pomocí rekurze nalézt řešení obecných úloh rozkladem
na dílčí úlohy stejného typu. Často jej nalezneme v algoritmech typu „rozděl a panuj“.
Tato programovací technika se hodí pro takové úlohy, u nichž je rozdělení na menší úlohy
stejného charakteru snadné a přirozené. Typickým příkladem přirozeně rekurzivního algoritmu
je průchod stromem (s obecným počtem potomků):
Příklady v C#
int fakt_rek(int number)
{
if (number < 0)
{
return 0;
}
if (number == 0 || number == 1)
{
return 1;
}
return number * fakt_rek(number - 1);
}
Zdroj: algoritmy.net