Funktionen und Rekursion in Kotlin 1.9: Eine ausführliche Anleitung
Функции и рекурсия в Kotlin
Что такое функция и зачем она нужна?
Представь, что ты учишься печь пирожки. Каждый раз, когда хочешь пирожок, ты не изобретаешь рецепт заново, а просто берешь готовый рецепт и повторяешь действия. В программировании функция — это такой же «рецепт»: кусок кода, который делает одно конкретное дело и может быть вызван в любой момент.
Зачем это нужно?
- Не повторяться. Если нужно 10 раз посчитать сумму, не надо писать один и тот же код 10 раз.
- Проще читать. Вместо длинного кода — понятные названия действий.
- Легко исправлять. Ошибка в одном месте — исправил в функции, и всё заработало.
Основной синтаксис функций в Kotlin
Функция в Kotlin начинается со слова fun. Дальше идет имя, в скобках — параметры (то, что мы передаем в функцию), а после скобок — тип результата, который функция возвращает.
fun имяФункции(параметр1: Тип, параметр2: Тип): ТипРезультата {
// тело функции
return результат
}
Если функция ничего не возвращает, пишем Unit (или просто ничего не пишем).
Пример 1: Сумма двух чисел (семейный бюджет)
Напишем функцию, которая принимает два числа (доходы) и возвращает их сумму.
fun summa(dohod1: Int, dohod2: Int): Int {
return dohod1 + dohod2
}
fun main() {
println("Введите первый доход:")
val a = readLine()!!.toInt()
println("Введите второй доход:")
val b = readLine()!!.toInt()
println("Общая сумма: ${summa(a, b)}")
}
Как это работает: Мы создали «рецепт» summa, который складывает два числа. В main мы просим пользователя ввести числа, а потом вызываем функцию и печатаем результат.
Пример 2: Сравнение температур
Функция принимает две температуры и возвращает большую.
fun bolshayaTemp(t1: Double, t2: Double): Double {
if (t1 > t2) {
return t1
} else {
return t2
}
}
fun main() {
println("Введите первую температуру:")
val a = readLine()!!.toDouble()
println("Введите вторую температуру:")
val b = readLine()!!.toDouble()
println("Большая температура: ${bolshayaTemp(a, b)}")
}
Пример 3: Проверка четности числа
Функция проверяет, четное ли число (делится ли на 2 без остатка).
fun proverkaChetnosti(chislo: Int): Boolean {
return chislo % 2 == 0
}
fun main() {
println("Введите количество коробок:")
val n = readLine()!!.toInt()
if (proverkaChetnosti(n)) {
println("Число четное, можно упаковать в пары.")
} else {
println("Число нечетное, одна коробка лишняя.")
}
}
Пример 4: Реверс строки
Функция переворачивает строку задом наперед.
fun revers(stroka: String): String {
var result = ""
for (i in stroka.length - 1 downTo 0) {
result += stroka[i]
}
return result
}
fun main() {
println("Введите сообщение:")
val text = readLine()!!
println("Перевернутое сообщение: ${revers(text)}")
}
Пример 5: Поиск минимального элемента в списке
Функция находит самую низкую температуру за день.
fun minimumTemp(temperaturi: List<Double>): Double {
var min = temperaturi[0]
for (t in temperaturi) {
if (t < min) {
min = t
}
}
return min
}
fun main() {
println("Введите температуры через пробел:")
val input = readLine()!!
val listTemp = input.split(" ").map { it.toDouble() }
println("Минимальная температура: ${minimumTemp(listTemp)}")
}
Рекурсия — функция вызывает саму себя
Рекурсия — это когда функция внутри своего кода вызывает саму себя. Представь матрешку: большая матрешка открывается, внутри — такая же, но поменьше, и так до самой маленькой. Рекурсия работает похоже: большая задача разбивается на такую же, но чуть проще.
Чтобы рекурсия не была бесконечной, обязательно нужно условие остановки — момент, когда функция перестает вызывать себя.
Пример рекурсии: факториал числа
Факториал числа 5 (обозначается 5!) — это 5 × 4 × 3 × 2 × 1. Можно посчитать так: 5! = 5 × 4!, а 4! = 4 × 3! и так далее. 1! = 1 — это условие остановки.
fun factorial(n: Int): Int {
return if (n == 1) {
1 // условие остановки
} else {
n * factorial(n - 1) // рекурсивный вызов
}
}
fun main() {
println("Введите число:")
val chislo = readLine()!!.toInt()
println("Факториал числа $chislo = ${factorial(chislo)}")
}
Как это работает: factorial(5) считает: «5 × factorial(4)». factorial(4) считает: «4 × factorial(3)». И так до factorial(1), который просто возвращает 1. Потом все результаты собираются обратно: 1 × 2 × 3 × 4 × 5 = 120.
Частые ошибки новичков
- Забыли return. Если функция должна возвращать значение, а
returnне написали — будет ошибка. - Бесконечная рекурсия. Нет условия остановки — программа зависнет или упадет с ошибкой.
- Путают параметры и аргументы. Параметры — это то, что написано в определении функции (в скобках). Аргументы — это конкретные значения, которые мы передаем при вызове.
- Имена функций. Называйте функции понятно:
summa,revers, а неf1,func2.
Итоговый пример: задача про бюджет и температуру
Представь, что у тебя есть данные о доходах за неделю и о температуре на улице. Нужно посчитать общий доход и найти самую высокую температуру. Мы используем две функции: одну для суммы, другую для максимума.
fun summaDohodov(dohodi: List<Int>): Int {
var sum = 0
for (d in dohodi) {
sum += d
}
return sum
}
fun maxTemp(temp: List<Double>): Double {
var max = temp[0]
for (t in temp) {
if (t > max) {
max = t
}
}
return max
}
fun main() {
println("Введите доходы за неделю через пробел:")
val dohodi = readLine()!!.split(" ").map { it.toInt() }
println("Общий доход: ${summaDohodov(dohodi)}")
println("Введите температуры за неделю через пробел:")
val temp = readLine()!!.split(" ").map { it.toDouble() }
println("Максимальная температура: ${maxTemp(temp)}")
}
Теперь ты знаешь главное: функции помогают не писать одно и то же много раз, а рекурсия — решать сложные задачи, разбивая их на простые шаги. Пробуй писать свои функции — это сделает код понятным и красивым!