Java Recursion

Оновлено: 22.05.2023

Рекурсія Java

Рекурсія - це техніка здійснення виклику самої функції. Ця техніка дозволяє розбити складні проблеми на простіші, які легше вирішити.

Рекурсію може бути трохи складно зрозуміти. Найкращий спосіб зрозуміти, як вона працює - це поекспериментувати з нею.

Приклад рекурсії

Додавання двох чисел є простим, але додавання діапазону чисел є більш складним завданням. У наступному прикладі рекурсія використовується для додавання діапазону чисел, розбиваючи його на просту задачу додавання двох чисел:

Використовуйте рекурсію, щоб додати всі числа до 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;

Коли викликається функція sum(), вона додає параметр k до суми всіх чисел, менших за k, і повертає результат. Коли k стає рівним 0, функція просто повертає 0. Під час запуску програма виконує наступні кроки:

10 + sum(9) 10 + ( 9 + sum(8) ) 10 + ( 9 + ( 8 + sum(7) ) ) ... 10 + 9 + 8 + 7 + 6 + 5 + 4 + 3 + 2 + 1 + sum(0) 10 + 9 + 8 + 7 + 6 + 5 + 4 + 3 + 2 + 1 + 0

Оскільки функція не викликає сама себе, коли k дорівнює 0, програма зупиняється на цьому і повертає результат.

Стан зупинки

Так само, як цикли можуть зіткнутися з проблемою нескінченного циклу, рекурсивні функції можуть зіткнутися з проблемою нескінченної рекурсії. Нескінченна рекурсія - це коли функція ніколи не припиняє викликати сама себе. Кожна рекурсивна функція повинна мати умову зупинки, тобто умову, коли функція припиняє викликати сама себе. У попередньому прикладі умова зупинки - це коли параметр k стає рівним 0.

Для кращого розуміння концепції корисно переглянути різні приклади. У цьому прикладі функція додає діапазон чисел між початком і кінцем. Умовою зупинки цієї рекурсивної функції є те, що кінець не більший за початок:

Використовуйте рекурсію, щоб додати всі числа від 5 до 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;
    }
  }
}
Розробник повинен бути дуже обережним з рекурсією, оскільки дуже легко зісковзнути на написання функції, яка ніколи не завершується, або такої, що використовує надмірну кількість пам'яті або процесорної потужності. Однак, при правильному написанні рекурсія може бути дуже ефективним і математично елегантним підходом до програмування.