Swift 5.9 में फ़ंक्शन और पुनरावृत्ति: विस्तृत मार्गदर्शिका
Функции и рекурсия в Swift
Введение: зачем нужны функции?
Представь, что ты каждый день считаешь, сколько денег потратил на обеды. Ты берешь калькулятор, складываешь числа… И так каждый день. Это скучно! Функции в программировании — как волшебные рецепты. Ты один раз пишешь рецепт (функцию), а потом просто говоришь: «Приготовь обед» — и он готовится сам, сколько угодно раз.
Функция — это блок кода, который делает одно полезное действие. Ты даешь ей данные (аргументы), она их обрабатывает и возвращает результат.
Основной синтаксис функций
В Swift функция начинается со слова func. Затем идет имя функции, в скобках — то, что она принимает (параметры), а через стрелку -> — то, что она возвращает.
// Простейшая функция: складывает два числа
func summa(a: Int, b: Int) -> Int {
let result = a + b
return result
}
// Используем функцию
let total = summa(a: 10, b: 25)
print("Сумма: \(total)")
Вывод: Сумма: 35
Если функция ничего не возвращает, пишем Void или просто ничего не пишем:
func privetstvie() {
print("Привет, ученик!")
}
privetstvie() // Выведет: Привет, ученик!
Функции с разными типами
Функции могут принимать строки, числа, массивы — что угодно. Пример для задачи «Сравнение температур»:
// Функция возвращает большую из двух температур
func maximum(t1: Double, t2: Double) -> Double {
if t1 > t2 {
return t1
} else {
return t2
}
}
print("Введите первую температуру:")
let first = Double(readLine()!)!
print("Введите вторую температуру:")
let second = Double(readLine()!)!
let maxTemp = maximum(t1: first, t2: second)
print("Максимальная температура: \(maxTemp)")
Пример ввода: 15.5, 23.1 → вывод: Максимальная температура: 23.1
Проверка четности — функция с булевым результатом
Для задачи с коробками:
func isEven(number: Int) -> Bool {
if number % 2 == 0 {
return true
} else {
return false
}
}
print("Введите количество коробок:")
let boxes = Int(readLine()!)!
if isEven(number: boxes) {
print("Четное число — можно упаковать в пары")
} else {
print("Нечетное — одна коробка останется лишней")
}
Пример ввода: 8 → вывод: Четное число — можно упаковать в пары
Функция для реверса строки
В Swift строки — это коллекции символов. Мы можем перебрать их и собрать задом наперед:
func reverseString(text: String) -> String {
var reversed = ""
for char in text {
reversed = String(char) + reversed
}
return reversed
}
print("Введите сообщение:")
let message = readLine()!
print("Перевернутое: \(reverseString(text: message))")
Пример ввода: Привет → вывод: Перевернутое: тевирП
Поиск минимального элемента в списке
Для метеостанции — функция, которая находит самое маленькое число в массиве:
func findMin(temperatures: [Double]) -> Double? {
if temperatures.isEmpty {
return nil
}
var minTemp = temperatures[0]
for temp in temperatures {
if temp < minTemp {
minTemp = temp
}
}
return minTemp
}
print("Введите температуры через пробел:")
let input = readLine()!
let stringNumbers = input.split(separator: " ")
var temps: [Double] = []
for s in stringNumbers {
if let num = Double(s) {
temps.append(num)
}
}
if let minimum = findMin(temperatures: temps) {
print("Минимальная температура: \(minimum)")
} else {
print("Нет данных")
}
Пример ввода: 12.5 8.3 15.0 6.7 10.1 → вывод: Минимальная температура: 6.7
Что такое рекурсия?
Рекурсия — это когда функция вызывает саму себя. Как матрешка: внутри большой матрешки — поменьше, внутри той — еще меньше. В программировании рекурсия удобна для задач, которые можно разбить на такие же, но меньшие.
Простой пример: подсчет суммы чисел от 1 до N.
func sumFromOne(to n: Int) -> Int {
if n == 1 {
return 1 // База: самая маленькая матрешка
} else {
return n + sumFromOne(to: n - 1) // Шаг рекурсии
}
}
print("Сумма от 1 до 5: \(sumFromOne(to: 5))")
Вывод: Сумма от 1 до 5: 15
Как это работает: sumFromOne(5) считает 5 + sumFromOne(4), тот считает 4 + sumFromOne(3)… и так до sumFromOne(1), который просто возвращает 1. Потом все складывается обратно.
Частые ошибки новичков
- Забыть return: Если функция должна возвращать значение, но ты не написал
return, компилятор выдаст ошибку. - Бесконечная рекурсия: Если забыть условие остановки (базу), функция будет вызывать себя бесконечно, пока программа не упадет.
- Путаница с типами: Нельзя передать строку туда, где ожидается число. Swift строгий — это хорошо, он ловит ошибки.
- Неверные имена параметров: В Swift при вызове функции нужно писать имена параметров, например
summa(a: 5, b: 3), а не простоsumma(5, 3).
Итоговый пример: семейный бюджет с рекурсией
Представь, что у тебя есть список доходов за неделю, и ты хочешь узнать общую сумму. Решим эту задачу двумя способами: обычной функцией и рекурсивной.
// Обычная функция (цикл)
func totalIncome(amounts: [Double]) -> Double {
var sum = 0.0
for amount in amounts {
sum += amount
}
return sum
}
// Рекурсивная функция
func recursiveSum(array: [Double]) -> Double {
if array.isEmpty {
return 0.0 // База: пустой массив — сумма 0
} else {
// Берем первый элемент + сумма остальных
return array[0] + recursiveSum(array: Array(array.dropFirst()))
}
}
print("Введите доходы за неделю через пробел:")
let inputLine = readLine()!
let parts = inputLine.split(separator: " ")
var incomes: [Double] = []
for part in parts {
if let value = Double(part) {
incomes.append(value)
}
}
print("Общая сумма (цикл): \(totalIncome(amounts: incomes))")
print("Общая сумма (рекурсия): \(recursiveSum(array: incomes))")
Пример ввода: 15000 8200 3500 12000 6000 → вывод: Общая сумма (цикл): 44700.0 и Общая сумма (рекурсия): 44700.0
Оба способа работают одинаково. Рекурсия выглядит элегантнее, но для больших массивов может быть медленнее. Выбирай то, что понятнее тебе!
Теперь ты знаешь главное: функции помогают не повторять код, а рекурсия — решать сложные задачи простым способом. Пробуй сам писать функции для своих задач!