Підпрограми (функції та процедури)

Підпрограма — це відокремлена частина програми, яка виконує конкретний алгоритм. Вони бувають двох типів: процедури — такі, що виконують певні дії без повернення результату; та функції — такі, що обчислюють деяке значення. Однак, на практиці часто функціями називають будь-які підпрограми. Цей термін добре знайомий Вам: кажуть, кожна річ має свою функціональність: чайник кип’ятить воду, машина їде, а книжку можна читати. Ці речі, що мають функцію, називають об’єктами, але не будемо зараз розглядати об’єкти детально. Функції надають можливість об’єднати певні інструкції й повторювати їх скільки потрібно разів, щоб не писати один код знову і знову. Окрім цього, функції дозволяють підставляти кожен раз різні значення в одні й ті ж дії за допомогою аргументів, які вказують у круглих дужках. Кожна функція повертає якесь значення-результат, тип якого вказують перед назвою функції, а якщо у неї не має результату (процедура), то треба вказати тип як void — пустий. Є і інші властивості, але пояснити поки що їх неможливо, то будемо просто писати public static.

Лише почавши вивчати Java, з першої сторінки Ви використовували одну із базових функцій System.out.print(значення), у якій вказувався 1 аргумент — значення яке виводилось; вона нічого не повертала, а просто виконувала дію виведення. length() це функція без аргументів, яка повертала довжину рядка. Взагалі, увесь код до цього був написаний у функції main(String[] args), і функції не можуть бути вкладеними, тому писати їх потрібно просто в класі Main, поза головною функцією! Спробуймо написати свою функцію за загальною схемою (public static не є обов’язковими, але поки що вважаймо інакше):

public static тип_повернення назва (аргументи_через_кому) {
	//Тіло функції
}

Далі приклад нашої простої функції suma, яка приймає 2 цілочисельні аргументи (a та b), додає їх та повертає отриману суму за допомогою слова return:

public static int suma(int a, int b) {
    return a + b;
}

З викликом функцій, зокрема print(значення), Ви вже знайомі: назва(значення_аргументів_через_кому). Наша suma(a, b) поверне суму, тобто можна вважати, що замість виклику буде результат:

int res = sum(2, 3);
//це те ж, що й
int res = 5;

Перевантаження

Важливо: повернення завжди є останньою дію, і все, що після return, не буде виконане! Як відомо, print(значення) може приймати не лише int, а й String та інші типи. Як цього досягти? Все просто, створити декілька функцій з однаковою назвою, але різним набором аргументів (такий перелік аргументів з їхніми типами професійно називають сигнатурою функції) — це називається перевантаженням функцій:

public static int suma(int a, int b) {
    return a + b;
}
public static float suma(float a, float b) {
    return a + b;
}

Рекурсія

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

Re(re(re(recursion)

Типовим прикладом є використання рекурсії як методу знаходження факторіала числа. Погляньте: 5! = 5 × 4 × 3 × 2 × 1 можна згорнути до 5! = 5 × 4!. Привівши до загального вигляду, видно, що факторіал числа дорівнює числу помноженому на факторіал числа меншого на 1, і так доки число не буде 1: n! = n × (n-1)!. Алгоритм буде таким: якщо число дорівнює 1, то повернути 1, а інакше, повернути число помножене на факторіал мешного на 1 числа:

public static int factorial(int n) {
	if (n == 1) return 1;
	else return n * factorial(n-1);
}

Тернарний оператор

До речі, у випадках, коли if-else короткий з однією інструкцією і повертає або присвоює значення, його можна замінити на тернарний оператор (“тернарний” означає потрійний) — ?:. Наприклад, такі вирази:

String a;
if (b < 3) a = "менше";
else a = "більше";
if (c == "yes") return 'y';
else return 'n';

можна замінити на такі:

String a = (b < 3)? "менше" : "більше";
return (c == "yes")? 'y' : 'n';

Це значно спрощує код. Важливо розрізняти: " використовується для рядків (String), а ' — для символів (char).

public static?

Наступна тема буде досить великою та складнішою для розуміння, однак там Ви зможете дізнатись, чому все, що ми досі писали, знаходится у якомусь “класі” Main. та навіщо кожна функція починалась з public static та які є інші не публічні і не статичні функції. Рекомендую спробувати добре обдумати всі попередні теми, а лише потім переходити до наступної.


Copyleft 🄯 2020–2024 Михайло Стецюк <yaBobJonez@gmail.com>.
Сайт має ліцензію Creative Commons License.
Дякую рідній школі та вчителям!