Підпрограми (функції та процедури)
Підпрограма — це відокремлена частина програми, яка виконує конкретний алгоритм. Вони бувають двох типів: процедури — такі, що виконують певні дії без повернення результату; та функції — такі, що обчислюють деяке значення. Однак, на практиці часто функціями називають будь-які підпрограми. Цей термін добре знайомий Вам: кажуть, кожна річ має свою функціональність: чайник кип’ятить воду, машина їде, а книжку можна читати. Ці речі, що мають функцію, називають об’єктами, але не будемо зараз розглядати об’єкти детально. Функції надають можливість об’єднати певні інструкції й повторювати їх скільки потрібно разів, щоб не писати один код знову і знову. Окрім цього, функції дозволяють підставляти кожен раз різні значення в одні й ті ж дії за допомогою аргументів, які вказують у круглих дужках. Кожна функція повертає якесь значення-результат, тип якого вказують перед назвою функції, а якщо у неї не має результату (процедура), то треба вказати тип як 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;
}
Рекурсія
Рекурсивні функції викликають самі себе; вони схожі на цикли, але інколи з ними легше працювати.
Типовим прикладом є використання рекурсії як методу знаходження факторіала числа. Погляньте: 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
та які є інші не публічні і не статичні функції. Рекомендую спробувати добре обдумати всі попередні теми, а лише потім переходити до наступної.