Java rekurze
Java rekurze
Rekurze je technika samotného volání funkce. Tato technika poskytuje způsob, jak rozdělit složité problémy na jednoduché problémy, které se snáze řeší.
Rekurze může být trochu obtížné pochopit. Nejlepší způsob, jak zjistit, jak to funguje, je experimentovat s tím.
Příklad rekurze
Sčítání dvou čísel je snadné, ale sčítání řady čísel je složitější. V následujícím příkladu se rekurze používá k sečtení řady čísel dohromady tak, že se rozdělí na jednoduchý úkol sečíst dvě čísla:
Příklad
Pomocí rekurze sečtěte všechna čísla do 10.
public class Main { public static void main(String[] args) { int result = sum(10); System.out.println(result);
}public static int sum(int k) { if (k > 0) { return k + sum(k - 1); } else { return 0;
}}
}
Příklad vysvětlen
Když je sum()
funkce volána, přidá parametr k
k součtu všech čísel menších než k
a vrátí výsledek. Když se k stane 0, funkce právě vrátí 0. Při spuštění program postupuje takto:
10 + ( 9 + součet(8) )
10 + ( 9 + ( 8 + součet(7) ) )
...
10 + 9 + 8 + 7 + 6 + 5 + 4 + 3 + 2 + 1 + součet(0)
10 + 9 + 8 + 7 + 6 + 5 + 4 + 3 + 2 + 1 + 0
Protože funkce nevolá sama sebe, když k
je 0, program se tam zastaví a vrátí výsledek.
Stav zastavení
Stejně jako smyčky mohou narazit na problém nekonečného opakování, rekurzivní funkce mohou narazit na problém nekonečné rekurze. Nekonečná rekurze je situace, kdy funkce nikdy nepřestane volat sama sebe. Každá rekurzivní funkce by měla mít podmínku zastavení, což je podmínka, kdy funkce přestane volat sama sebe. V předchozím příkladu je stav zastavení, když se parametr k
stane 0.
Pro lepší pochopení konceptu je užitečné vidět různé příklady. V tomto příkladu funkce přidá rozsah čísel mezi začátek a konec. Podmínka zastavení pro tuto rekurzivní funkci je, když konec není větší než začátek :
Příklad
Pomocí rekurze sečtěte všechna čísla mezi 5 a 10.
public class Main { public static void main(String[] args) { int result = sum(5, 10); System.out.println(result);
}public static int sum(int start, int end) { if (end > start) { return end + sum(start, end - 1); } else { return end; } } }