🍎 Swift

Funciones y recursión en Swift 5.9: guía detallada

Функции и рекурсия в 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

Оба способа работают одинаково. Рекурсия выглядит элегантнее, но для больших массивов может быть медленнее. Выбирай то, что понятнее тебе!

Теперь ты знаешь главное: функции помогают не повторять код, а рекурсия — решать сложные задачи простым способом. Пробуй сам писать функции для своих задач!