Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Стандартные функции




End.

Begin

Begin

Begin

Begin

Begin

f:=1;

For i:=1 to n do f:=f*i;

Factorial:=f

End;

Для простоты здесь не включен контроль отрицательных чисел и переполнения разрядной сетки при больших значениях n.

В то же время, многие циклические алгоритмы можно организовать без применения циклов – в виде рекурсии. Многие алгоритмы в рекурсивном исполнении выглядят "изящнее" и работают эффективнее, чем такие же итеративные алгоритмы. В частности, рекурсивные алгоритмы применяют для поиска в разветвленных структурах данных, для синтаксического разбора исходного текста программ на языках высокого уровня при их трансляции и т.д.

Вычисление факториала по рекурсивному алгоритму определяется так:

n! = n ´ (n – 1)!

Иными словами, чтобы вычислить n!, нужно факториал от n – 1 умножить на n.

Вычислим рекурсивно 4!

4! = 4 ´ (4-1)! = 4 ´ 3!

3! = 3 ´ (3-1)!= 3 ´ 2!

2! = 2 ´ (2-1)! = 2 ´ 1!

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

Function Factorial(n:Integer):Integer;

Var f:Integer;

If n<=1 then f:=1

else f:=Factorial(n-1); {рекурсивный вызов}

Factorial:=f

End;

Циклов в этой функции нет, зато есть рекурсивный вызов. Функция вызывает сама себя, если значение параметра больше 1 (но значение параметра при каждом рекурсивном вызове уменьшается на единицу).

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

При описании двух и более взаимно-рекурсивных процедур и функций возникает трудность, состоящая в том, что согласно правилам видимости имен, любой программный элемент может быть доступен по имени только после того, как он описан. Если есть две взаимно-рекурсивных процедуры А и В, и процедура А описана раньше, чем процедура В, то вызов процедуры В изнутри процедуры А будет предшествовать описанию процедуры В. Если сначала описать процедуру В, а затем А, то вызов процедуры А изнутри процедуры В также будет предшествовать описанию процедуры А. Для преодоления этой трудности в Паскале предусмотрено опережающее описание процедур и функций. Такое описание состоит из заголовка процедуры или функции, за которым следует слово Forward.

опережающее описание::= (<заголовок функции> | <заголовок процедуры>) ";" "Forward".

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

Если взаимно-рекурсивных процедур или функций более, чем две, например, n, вначале делают n– 1 опережающих описаний, затем описывают процедуру или функцию, для которой не сделано опережающее описание, затем в произвольном порядке все процедуры и функции, для которых сделаны опережающие описания.

Program Reciprocal;

Var i,j: Integer; R:Real;

Procedure A(S:Real;Var i,j:Integer);Forward;

Function B(T:Real):Real;

Var N,M:Integer;

..... {пропускаем фрагмент программы}

A(T,N,M);

..... {пропускаем фрагмент программы}

End;

Procedure A; {формальные параметры описаны ранее, поэтому здесь они не повторяются}

Var E:Real;

..... {пропускаем фрагмент программы}

S:=B(E);

..... {пропускаем фрагмент программы}

End;

..... {пропускаем фрагмент программы}

A(R,i,j);

..... {пропускаем фрагмент программы}

Стандартные функции и стандартные процедуры, рассматриваемые далее, встроены в систему программирования. Их не нужно описывать перед использованием, они предоставлены в готовом виде. Поэтому их также называют предопределенными.




Поделиться с друзьями:


Дата добавления: 2014-01-11; Просмотров: 326; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.007 сек.