НАЙКРАЩИЙ САЙТ ДЛЯ ВЕБ-РОЗРОБНИКІВ
Мова програмування Java. W3Schools українською. Уроки для початківців

En

Java Рекурсія


Java Рекурсія

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

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

Що таке рекурсія? Відповідь від ChatGPT:

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

Рекурсія є потужним інструментом в програмуванні, оскільки дозволяє розв’язувати складні задачі шляхом розбиття їх на менші підзадачі. Вона часто використовується в алгоритмах пошуку, сортування, обходу дерев та графів.

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

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

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

Приклад

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

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

Приклад

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

Розробник має бути дуже обережним з рекурсією, оскільки може бути дуже легко скользнути до написання функції, яка ніколи не завершується, або такої, яка використовує надлишок пам’яті чи потужності процесора. Однак, правильно написана рекурсія може бути дуже ефективним і математично елегантним підходом до програмування.