Функция – это именованное преобразование входных данных (аргументов) в выходное значение по фиксированному алгоритму. Возврат значения – акт передачи вычисленного результата и управления вызывающей позиции. В императивных языках он реализуется оператором return v (или неявным возвратом в некоторых диалектах), в функциональных – последним выражением тела.
Зачем это знать для ЕГЭ: значительная часть заданий предполагает реализацию вычисления как функции: расчёт выражений, агрегаты массивов, обработка строк, рекурсивные определения. Корректное понимание типов, областей видимости и точного момента возврата позволяет исключить логические ошибки и формально доказать корректность решения.
Пусть задана сигнатура:
f: T1 × T2 × ... × Tk → R
где Ti – типы аргументов, R – тип результата. Спецификация определяется парой:
Pre(x1,...,xk) – предусловие (допустимость аргументов)
Post(x1,...,xk, y) – постусловие (свойства результата y)
Корректный вызов:
если Pre(x1,...,xk) = True, то ∃! y: f(x1,...,xk) = y и Post(...) = True.
В императивной операционной семантике возврат – это переход из конфигурации «внутри функции» в конфигурацию «в точке вызова» с помещением y в место назначения (аккумулятор/стек вызовов/регистры/переменная-получатель).
Явный и неявный возврат
Явный: return выражение; – мгновенно завершает функцию.
Неявный: в некоторых языках последняя строка тела – возвращаемое значение (например, псевдокод или функциональные ЯП).
Тип результата и приведение
Инвариант совместимости:
Тип(выражения в return) ≤: R
где ≤: – отношение подтипирования или допустимого неопасного приведения. Нарушение – ошибка компиляции/выполнения.
Множественный возврат и ранний выход
Функция может иметь несколько точек return (ранний выход при ошибке/краевом случае). Инвариант: каждый путь исполнения в непустой функции должен завершаться корректным return (или исключением, оговоренным контрактом).
Область видимости
Локальные переменные функции существуют на стеке вызовов (или в активационном рекорде) и уничтожаются после возврата. Возвращать ссылку на локальный объект, который будет уничтожен, – ошибка (висячая ссылка).
Чистота и детерминизм
Функция чиста, если:
1) Не имеет побочных эффектов (не изменяет состояние вне своих локальных переменных).
2) Для одинаковых аргументов всегда возвращает одинаковое значение.
Чистые функции облегчают тестирование, доказательство корректности и оптимизацию.
Контракт «отсутствия побочных эффектов» (для ЕГЭ)
При решении задач: если явно не требуется изменить глобальное состояние, проектируйте решение как f(A) → result, где A неизменяем, а ответ возвращается через return.

Скаляры (числа, булевы значения)
Обычно возвращаются по значению; важна точность (целые/вещественные), переполнения и формат.
Структуры/записи/кортежи
Для возврата нескольких логически связанных величин используйте структуру или кортеж:
return (min, max)
Преимущество – ясность контракта и атомарность передачи.
Коллекции (массивы, списки)
Возврат коллекции допустим; учитывайте стоимость копирования (в абстракции экзамена – несущественно, но полезно понимать). При больших данных – предпочтительны итераторы/генераторы (если язык поддерживает), однако на ЕГЭ чаще требуются конечные массивы/строки.
База и шаг рекурсии
Инвариант корректности рекурсии:
1) База: при простейших аргументах возвращаем ответ без рекурсивных вызовов.
2) Шаг: сводим задачу к меньшей и корректно используем возвращаемое значение подзадачи.
Схемы использования возвращаемых значений
Акумуляция снизу вверх: return combine(f(subproblem1), f(subproblem2)).
Ранний возврат при найденном ответе: поиск в дереве/графе.
Хвостовая рекурсия
Если return f'(args') – единственное действие в ветви, возможно преобразование в цикл; полезно для эффективности (понятийно).
Булевы флаги и «сентинелы»
Простейший способ – возвращать специальное значение (например, -1, "", false), сигнализирующее об отсутствии результата. Недостаток – возможная путаница с «настоящими» значениями.
Пары «код + значение»
Возвращать кортеж:
(success, value)
где success ∈ {True, False}. Явно и надёжно.
Исключения (если язык поддерживает)
Исключение прерывает обычный путь и не выдаёт результат; обработка выполняется у вызывающего. На ЕГЭ это реже требуется, но семантически полезно.
Пред- и постусловия
В псевдокоде фиксируйте контракт:
# Pre: n ≥ 0
# Post: возвращает n! (факториал)
Далее доказывайте соответствие: по индукции/по разбору случаев.
Неизменяемые аргументы
Для функций-агрегаторов (суммы/минимумы) требуйте, чтобы входные коллекции не изменялись. Это облегчает проверку корректности и упрощает отладку.
Идемпотентность
Если повторный вызов с теми же аргументами возвращает тот же результат и не меняет состояние, функция идемпотентна (частный случай чистоты).
R1 У функции должна быть одна «ответственность»: имя → понятно, что возвращает.
R2 Явно задавайте тип результата и документируйте единицы измерения (если числовой).
R3 Все пути исполнения завершаются return/исключением, согласованным с сигнатурой.
R4 Не возвращайте ссылки/указатели на локальные объекты, чья жизнь заканчивается с возвратом.
R5 Предпочитайте возвращать значение, а не изменять глобальное состояние.
R6 Для нескольких величин – кортеж/структура (семантически связаны).
R7 Для «может не быть результата» – явный контейнер «опционально»/пара (found, value).
R8 В рекурсии отделяйте базу от шага; используйте возвращаемые значения подзадач.
R9 Пишите тесты на контракты: граничные случаи, пустые коллекции, большие числа.
R10 Уплотняйте логику: избегайте лишних ветвлений до return (ранний выход на ошибках).
Сигнатура:
f: T1 × ... × Tk → R
Контракт:
Pre(args) → Post(args, result)
Совместимость типов:
Тип(return-выражения) ≤: R
Рекурсия (скелет):
если база(args): return base_value
иначе: return combine( f(smaller_args), ... )
Двухканальный результат:
return (success, value) # success ∈ {True, False}
Упражнение 1. Агрегаты массива с чистым возвратом
Задание. Напишите функцию Stats(A) → (min, max, avg), где A – непустой массив целых.
Требования.
a) Сформулируйте Pre и Post.
b) Обоснуйте, почему функция не изменяет A.
c) Докажите, что min ≤ avg ≤ max.
Подсказка. Используйте длинный тип для суммы, чтобы исключить переполнение.
Упражнение 2. Рекурсивный возврат: количество цифр
Задание. Реализуйте DigitsCount(n) → d для n ≥ 0 (десятичная запись).
Требования.
a) Определите базу и шаг рекурсии.
b) Докажите корректность индукцией по числу разрядов.
c) Сравните с итерационной версией; обе возвращают одинаковый результат для всех n.
Подсказка. База: n < 10 ⇒ return 1; шаг: return 1 + DigitsCount(n // 10).
Упражнение 3. Поиск в массиве с двухканальным результатом
Задание. Напишите Find(A, x) → (found, pos), где found ∈ {True, False}, pos – индекс или -1.
Требования.
a) Укажите точный контракт Post.
b) Объясните, почему «сентинел» -1 не конфликтует с валидными индексами.
c) Дайте формальное доказательство отсутствия «ложно найденных» результатов.
Подсказка. Если found=False, обязателен pos=-1.
Упражнение 4. Правильный тип результата: среднее и округления
Задание. Функция MeanInt(A) должна вернуть целое среднее по правилу «округление вниз».
Требования.
a) Выберите тип суммы и результата.
b) Объясните, почему return sum // len(A) корректен для неотрицательных и отрицательных чисел (свойства целочисленного деления).
c) Приведите тесты граничных случаев: A=[−1], A=[−1,1], большие A.
Упражнение 5. Возврат кортежа для квадратного уравнения
Задание. Напишите SolveQuadratic(a,b,c) → (success, x1, x2).
Требования.
a) Если success=False, то x1=x2=0 (договорной нуль).
b) Для success=True проверьте a·x1^2 + b·x1 + c = 0 и аналогично для x2.
c) Обсудите числовую устойчивость при больших коэффициентах и какой тип выбрать для результата.
Подсказка. Дискриминант D = b*b − 4*a*c; D<0 ⇒ (False,0,0).
Возврат значения – не просто синтаксическая деталь, а центральный механизм, связывающий спецификацию задачи, типы данных, корректность алгоритма и чистоту архитектуры. Строгое понимание сигнатур, контрактов, областей видимости и инвариантов позволяет проектировать функции, которые надёжно, предсказуемо и проверяемо решают подзадачи любой сложности.
Для ЕГЭ по информатике умение проектировать и использовать функции с корректным возвратом результата – залог аккуратного, краткого и проверяемого решения, в котором легко аргументировать верность и оценить сложность. Это формирует алгоритмическую культуру и дисциплину программирования, необходимые как в экзаменационной, так и в профессиональной практике.