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 kk součtu všech čísel menších než ka vrátí výsledek. Když se k stane 0, funkce právě vrátí 0. Při spuštění program postupuje takto:

10 + součet(9)
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ž kje 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 kstane 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;
    }
  }
}