🧩 Подпрограммы: процедуры и функции
Структуризация программ, модульность, повторное использование кода
📌 Что такое подпрограмма?
Подпрограмма — это логически обособленная группа операторов, которая имеет имя и может быть вызвана из других частей программы многократно. Подпрограммы позволяют:
- разбить сложную задачу на простые шаги (декомпозиция);
- избежать дублирования кода;
- упростить отладку и тестирование;
- повысить читаемость программы.
Аналогия Подпрограмма похожа на кулинарный рецепт: вы не повторяете весь процесс каждый раз, а просто используете имя рецепта, когда нужно его приготовить.
🔧 Процедуры и функции: в чём разница?
В большинстве языков программирования подпрограммы делятся на два типа:
| Тип | Описание | Пример (Python) |
|---|---|---|
| Процедура | Выполняет действия, но не возвращает значение. В Python аналог — функция, которая ничего не возвращает (или возвращает None). | def print_hello(): print("Hello!") |
| Функция | Выполняет вычисления и возвращает результат (через return). Может использоваться в выражениях. | def add(a, b): return a + b |
В Pascal процедура и функция оформляются отдельными конструкциями, в Python различия менее формальны, но принцип тот же: если есть return — функция, иначе — процедура.
📤 Параметры и аргументы
Параметры — это переменные, перечисленные в заголовке подпрограммы. Аргументы — конкретные значения, передаваемые при вызове.
Различают несколько способов передачи параметров:
- По значению — подпрограмма получает копию значения, изменения внутри не влияют на исходную переменную.
- По ссылке — подпрограмма работает с исходной переменной (например, через
varв Pascal или изменяемые объекты в Python).
# Пример в Python: параметры по значению (неизменяемые типы)
def change(x):
x = 10 # меняется локальная копия
a = 5
change(a)
print(a) # 5, исходное значение не изменилось
# Для изменяемых объектов (списки) изменения видны снаружи
def append_element(lst):
lst.append(100)
my_list = [1,2,3]
append_element(my_list)
print(my_list) # [1,2,3,100]
🌐 Область видимости
- Локальные переменные объявляются внутри подпрограммы и доступны только в ней.
- Глобальные переменные объявляются вне всех подпрограмм и доступны везде. Их использование внутри подпрограмм требует осторожности (в Python для изменения глобальной переменной нужно ключевое слово
global).
# Python: глобальная и локальная переменные
x = 10 # глобальная
def test():
y = 5 # локальная
global x
x = x + 1 # изменяем глобальную
print(x, y)
test() # 11 5
🔄 Рекурсия
Рекурсия — это способ организации подпрограммы, при котором она вызывает саму себя. Рекурсия позволяет элегантно решать задачи, разбивающиеся на аналогичные подзадачи (вычисление факториала, обход деревьев, быстрая сортировка и т.д.).
Важно: любая рекурсивная функция должна иметь базовый случай (условие выхода), чтобы избежать бесконечного вызова.
# Пример: рекурсивное вычисление факториала
def factorial(n):
if n <= 1:
return 1 # базовый случай
else:
return n * factorial(n - 1) # рекурсивный вызов
print(factorial(5)) # 120
✍️ Практические задания (выполняются в тетради)
- Дайте определения: запишите своими словами, что такое подпрограмма, процедура и функция. Приведите по одному примеру из реальной жизни, иллюстрирующему каждый тип.
- Заполните таблицу. Для каждого из приведённых ниже описаний определите, нужна ли процедура или функция, и укажите, какие параметры она должна принимать.
| Задача | Тип (процедура/функция) | Параметры (входные/выходные) |
|---|---|---|
| Вывести на экран таблицу умножения для заданного числа | ||
| Вычислить площадь прямоугольника по его сторонам | ||
| Поменять местами значения двух переменных | ||
| Проверить, является ли число чётным |
- Анализ области видимости. Рассмотрите фрагмент кода на Python:
Ответьте на вопросы:
a = 5 def f(): b = 10 global a a = a + 1 print(a, b) f() print(a)- Какая переменная является глобальной?
- Какая переменная является локальной?
- Что будет выведено на экран после вызова
f()? - Что будет выведено после завершения работы функции?
- Рекурсивный вызов. Нарисуйте в тетради схему (дерево) рекурсивных вызовов для функции
factorial(4)(пример из теории). Укажите каждый вызов, возвращаемое значение и покажите, как в итоге получается результат. - Проектирование подпрограмм. Опишите (на естественном языке или псевдокоде) набор подпрограмм для решения следующей задачи:
«Даны два массива целых чисел одинаковой длины. Необходимо вычислить скалярное произведение этих массивов (сумму попарных произведений) и вывести результат на экран. Если длина массивов разная, выдать сообщение об ошибке.»
Укажите, какие подпрограммы (процедуры/функции) вы бы создали, какие параметры они бы принимали, и как бы они взаимодействовали друг с другом.
Примечание: все задания выполняются письменно в тетради. Код писать не требуется, достаточно описаний, схем и ответов на вопросы.
📘 Контрольные вопросы для самопроверки
- Что такое подпрограмма? Какие преимущества даёт её использование?
- Чем процедура отличается от функции?
- Что такое формальные и фактические параметры?
- Какие способы передачи параметров существуют?
- Что такое локальные и глобальные переменные? В чём разница в области видимости?
- Что такое рекурсия? Приведите примеры задач, где рекурсия удобна.
- Как в Python объявить функцию, которая изменяет глобальную переменную?