Лекция №12. Функции и их параметры. Рекурсия 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Лекция №12. Функции и их параметры. Рекурсия



Цель – получить представление об особенностях разработки и использования пользовательских функций.

 

Кроме стандартных функций, расположенных в заголовочных файлах, которые подключаются к программе с помощью опера­тора #include<имя.h>, языки С/С++ позволяют пользователю фор­мировать свои собственные функции. Эти функции целесообразно создавать, если при решении задач возникает необходимость проводить вычисления по одним и тем же алгоритмам многократно. Применение функций позволяет разделить программу на простые, легко контролируемые части, а также скрыть несущественные для других частей программы детали ее реализации. Таким образом, функция - это логически завершенный и оформленный в соответствии с требованиями языка фрагмент программы.

Функции размещаются в программе в любом порядке и считаются глобальными для всей программы. При использовании функций необходимо различать описа­ние функции и оператор вызова функции. Структура функции похожа на структуру программы main. Описание функции содержит заголовок функции, объявления пе­ременных и операторы:

тип_функции имя_функции (список формальных_параметров)

{ объявления переменных;

оператор1;

…;

операторN; }

Здесь: тип_функции - тип возвращаемого в основную про­грамму результата; имя_функции - уникальное имя, соответствующее по смыслу операции, которую выполняет функция (например, max - опре­деление максимального из двух чисел); список_формальных_параметров - перечень формальных параметров и их типов.

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

Для вызова функции достаточно указать ее имя со списком фактических параметров в любом выражении вызывающей про­граммы:

имя_функции (список_фактических_параметров);

Здесь: список_фактических_параметров - перечень фактических параметров. Фактические параметры - это наименования переменных, значения которых при обращении к функции, присваиваются соответствующим формальным параметрам.

Для возвращения вычисленного значения в основную программу в функциях используется оператор return(результат);

Рассмотрим примеры использования функций в программах.

 

Пример 12.1 - Функция show не содержит параметров и не возвращает значение в основную программу.

#include <iostream.h>

#include <conio.h>

void show (void)

{cout<<"Функция show"<<endl; }

void main (void)

{ clrscr();

cout<<"BЫ3OB функции show"<<endl;

show();

соut<<"Возврат в основную программу"<<endl;

getch();}

Пример 12.2 - Функция max содержит формальные параметры и не возвращает значение в основную программу.

#include <iostream.h>

#include <conio.h>

void max (float x, float у) //х, у - формальные параметры

{if (x>y) cout<<x<<">"<<y<<endl;

else cout<<y<<">"<<x<<endl;}

void main (void)

{ clrscr();

float a, b;

cout<<”введите a и b “<<endl; cin>>a>>b;

max (a,b);

getch();}

Пример 12.3 - Функция max содержит формальные параметры и возвращает зна­чение в основную программу. Возвращаемое значение имеет тип float.

#include <iostream.h>

#include <conio.h>

float max (float x, float y)

{ float result;

if (x>y) result=x; else result=y;

return (result);}

void main (void)

{clrscr();

float a, b;

cout<<”введите a и b “<<endl; cin>>a>>b;

соut<<”Наибольшее из двух чисел "<<а<<" и "<<b<<":" <<max (a, b) <<endl;

cout<<"Haибoльшee из двух чисел 2.71 и 3.14:" <<max(2.71,3.14)<<endl;

getch();}

В приведенных примерах описание функции предшествовало обращению к ней. В противном случае в начало программы нужно поместить прототип функции – т.е. объект, который содержит ин­формацию об имени функции, типе возвращаемого значения, ко­личестве и типе формальных параметров, например, float max (float, float);

Значения формальных параметров функции могут использоваться по умолчанию. Например,

#include <iostream.h>

void show (int a=l, int b=2, int c=3)

{ cout<<a<<" "<<b<<" "<<c<<endl;}

void main (void)

show ();

show (4);

show (5,6);

Взаголовке функции show происходит присваивание значений формальным параметрам a, b и с. При первом обращении к функции фактические параметры отсутствуют, при втором - указывается значение для параметра а, при третьем - значения для параметров а и b. Из примера видно, если опущено значение одного параметра, то опускаются значе­ния и всех последующих параметров. В результате работы программы на экран бу­дет выведено: 123 423 563. Таким образом, если при вызове функции отсутствуют значе­ния каких-то фактических параметров, то функция ис­пользует вместо них значения формальных параметров, назна­ченных пользователем по умолчанию.

С целью улучшения наглядности и удобочитаемости пользовательских программ используется перегрузка функций, которая позволяет использовать одно и то же имя для нескольких функций, решающих одну и ту же задачу, но имеющих разное количество и разные типы формальных пара­метров. Для того чтобы осуществить перегрузку функций, в про­грамме просто описываются функции с одинаковыми именами. При решении программы компилятор самостоятельно, без каких-либо дополнительных указаний определяет нужную фун­кцию на основании списка фактических параметров в операторе вызова функции. Рассмотрим пример использования перегрузки функций в программе.

#include <iostream.h>

int sum(int a, int b)

{ return(a+b);}

float sum (float a, int b, int c)

{return (a+b+c);}

void main (void)

{cout<<sum(2, 3) <<endl;

cout<<sum (2.5,3,4) <<endl;}

В примере определены две функции sum с разным ко­личеством и типами формальных параметров. В результате ра­боты программы сначала осуществляется обращение к первой функции sum, которая складывает два значения (2+3=5) типа int. За­тем происходит обращение ко второй функции sum, которая склады­вает три значения (2.5+3+4=9.5) и возвращает в основную про­грамму результат типа float.

Одной из особенностей использования фун­кций в программах является объявление локальных и глобальных переменных. Локальные переменные объявляются внутри функции точно так же, как и внутри главной функции main. Локальные переменные действуют только внутри функции, в которой они объявлены. Глобальные переменные объявляются в начале программы вне какой-либо функции. Глобальные переменные доступны для лю­бой функции в программе.

Если локальная и глобальная переменные имеют одинаковые имена, то переменная в функции воспринимается компилятором С/C++ как локальная переменная. Если внутри функции нужно исполь­зовать глобальную переменную, совпадающую по имени с локаль­ной переменной, то в этом случае нужно воспользоваться гло­бальным оператором разрешения:

:: имя_переменной

Например,

#include <iostream.h>

int xg=l; //объявление глобальной переменной

void show (int xg)

{ cout<<"Локальная переменная xg: "<<xg<<endl;

cout<<Глобальная переменная xg: "<<::xg<<endl;}

void main (void)

{ int y=0;

show(y); }

В результате работы программы на экран дисплея будет вы­ведено:

Локальная переменная xg:0

Глобальная переменная хg:1

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

При решении вычислительных задач часто используются рекурсивные функции (функции, вызывающие сами себя). Рекурсивные функции, которые прямо вызывают сами себя, называются включительно рекурсивными. Если две функции вызывают друг друга, они называются взаимно рекурсивными.

Решение рекурсивной задачи обычно разбивается на несколько этапов. Одним из этапов является решение базовой задачи, т.е. простейшей задачи, для которой написана вызываемая функция. Если задача оказывается более сложной, чем базовая, она делится на две подзадачи: выделение базовой задачи и всего остального. При этом часть, не являющейся базовой задачей должна быть проще, чем исходная задача, иначе рекурсия не сможет завершиться. Процесс продолжается до тех пор, пока не сведется к решению базовой задачи [6-8].

Каждый вызов рекурсивной функции называется рекурсивным вызовом или шагом рекурсии. Целесообразно использовать рекурсию для вычисления факториала, возведения в степень, вычисления числа Фибоначчи и др. В качестве примера рассмотрим рекурсивное вычисление факториала. По определению факториала: n!=n*(n-1)*(n-2)*…*2*1, причем 0!=1, 1!=1.

Рекурсивное решение заключается в многократном вызове функции вычисления факториала из самой функции. Например, при вычислении 5! вычисление 1! – базовая задача, а также признак завершения рекурсии. Таким образом, 1!=1 – возвращает 1

2!=2*1!= 2*1=2 – возвращает 2

3!=3*2!=3*2=6 – возвращает 6

4!=4*3!=4*6=24 – возвращает 24

5!=5*4!=5*24=120 – возвращает 120



Поделиться:


Последнее изменение этой страницы: 2016-09-20; просмотров: 427; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.116.90.141 (0.013 с.)