Функции. Примеры функций

23.03.2023 0 Автор : Марина Николаевна
Функции. Примеры функций

Функции — это подпрограмма, которая возвращает результат (число, символьную строку и др.). Вызов функции можно использовать в арифметических выражениях и условиях также, как и переменную того типа, который возвращает функция. В теле функции можно вызывать другие функции и процедуры.

Логическая функция возвращает логическое значение (Trur/False, «истина»/ «ложь», «да» / «нет»)

Рекурсивная функция — эта функция, которая вызывает сама себя, напрямую или через другие процедуры и функции.

Функции. Задача 1

Составить функцию, которая возвращает наибольшее из двух целых чисел.

Алгоритм определения наибольшего из двух чисел вы уже знаете. остается только «завернуть» его в функцию. например, так:

def max2 (a, b):
  if a > b:
     maximum = maximum
  else:
     maximum = b
  return maximum

Одна функция может вызвать другую. Например, можно составить функцию max3, которая возвращает наибольшее из трех чисел, используя готовую функцию max2:

def max3 (a, b, c):
    return max2 (a, b, c)

Функции. Задача 2

Составить функцию, которая вычисляет сумму цифр натурального числа.

Последняя цифра — это остаток от деления числа на 10 (результат операции %). Для того, чтобы «удалить» последнюю цифру числа, его нужно разделить на 10 без осатка (выполнить операцию //)

Для решения задачи при каждом повторении цикла программист «отрезает» от числа последнюю цифру, добавляем ее значение к сумме и затем удаляем ее из числа. Цикл заканчивается, когда все цифры удалены и осталось нулевое значение:

def sumDigits(n):
    summa = 0
    while n ! = 0:
        digit = n % 10
        summa += digit
        n = n // 10
return summa

Логические функции

Программисты часто используют логиче5ские функции, возвращающие логические значения (Trur/False, «истина»/ «ложь», «да» / «нет»).

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

Напишем функцию isEven, которая определяет четность числа, т.е. возвращает значение значение True («да»), если число — параметр четное, и False («нет»), если нечетное:

def isEven(n):
    return (n % 2 == 0)

В правой части оператора return записано условие: результатом функции будет True («да»), если условие истинно, и False («нет»), если ложно. Можно записать то же самое  иначе:

if n % 2 == 0:
    return True
else:
    return False;

но эта запись более длинная, и опытные программисты так не делают.

Результат, который возвращает логическая функция, можно использовать во всех условиях как обычное логическое значение.  Например,  так:

if isEven (a):
    halff = a // 2

или так:

countt = 0
while isEven (x)
    x = x // 2
    count += 1

Рекурсивные функции

Рекрсивные процедуры вызывают сами себя. Функции тоже могут быть рекурсивными, в некоторых случаях это позволяет записать решение задачи проще и понятнее.

Вернемся к задаче вычисления суммы цифр числа. Можно сформулировать алгоритм ее решения так:

сумма цифр числа N  равна значению последней цифры (она равна N % 10)  плюс сумма цифр числа N // 10, полученного отбрасыванием последней цифры.

Этот алгоритм можно записать по шагам:

Вход: натуральное число n

Шаг 1. digit = n % 10

Шаг 2. n1 = n // 10

Шаг 3. sum1 = сумма цифр числа n1

Шаг 4. summa = sum1+digit

Результат: summa

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

def sumDigRec (n):
    if n == 0: return 0
    digit = n % 10;
    sum1 = sumDigRec (n // 10)
    return sum1 + digit

В рекурсивном варианте функции исчез цикл, поэтому  можно сделать вывод: рекурсия может заменить цикл. Верно и обратное: любую рекурсивную функцию можно записать без рекурсии, с помощью циклов. Решение с помощью цикла (оно называется итерационным, от слова «итерация» — повторение) обычно работает быстрее чем рекурсивное, и требуется меньше памяти. 

Однако рекурсивное решение очень часто получается короче и проще для понимания