РЕКУРСИИ.

ОБЛАСТ?ДЕЙСТВИЯ ПАРАМЕТРОВ.

Пр?создании программ, использующих процедур? следуе?учитыват? чт?вс?объект?(метк? констант? типы, переменные, процедур??функци?, которы?описываются посл?заголовк?процедур? называют? локальными объектам?/u> ?доступны только ?пределах этой процедур? но недоступны вызывающей программ? Вс?эт?объект?создаются пр?вход??процедур??уничтожают? пр?выходе из не? Если одно ?то же имя определено ?нескольких процедурах, вызываемых одно??то?же программой, то ?каждой процедур?этом?имен?соответствуе?свой локальны?объект.

Вс?объект? описанны??вызывающей программ? называют? глобальным?/u> ?являют? доступными внутри процедур, вызываемых этой программой. Поэтом?обме?данным?межд?программой ?вызываемой ею процедурой може?производиться ?чере?глобальные переменные. Если одно ?то же имя определено ??программ? ??вызываемой ею процедур? то ем?соответствуе?глобальный объект, но внутри процедур?глобальный объект недоступен, он ка?бы экранирует? (маскируется) локальны?объектом ?таки?же именем.

?Turbo Pascal допускается любо?уровен?вложенност?процедур ?функци? Процедур? описанная ?основной программ? може?имет?описан? внутренних процедур ?функци???? Пр?этом объект? описанны??вызывающей процедур? являют? глобальным?по отношени??вызываемой процедур?

Для доступ??объектам, описанны??различны?блоках, требуется соблюдение следующи?правил:

1. Имен?объектов, описанны??некоторо?блок? считаются известными ?пределах данног?блок? включая ?вс?вложенны?блок?

2. Имен?объектов, описанны??блок? должны быть уникальн??пределах данног?блок??могу?совпадат??именам?объектов из других блоков.

3. Если ?некоторо?блок?описан объект, имя которого совпадае??именем объект? описанного ?объемлющем блок? то эт?последне?имя становит? недоступны??данном блок?(он?ка?бы экранирует? одноименны?объектом данног?блок?.

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

 

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

 

Пример 6: Вычислит?факториа?натурального числ? Для того, чтоб?вычислит?N!, надо знат?значение (N-1)! ?умножить ег?на N, пр?этом 1!=1. ?обще?виде эт?можн?записать та?

 

Решени?

program pr6;

var n,f:integer;

function fact(n:integer):integer;

begin

if n=1 then fact:=1

else fact:=n*fact(n-1)

end;

begin

writeln(‘Ввест?числ?n>1?;

read(n);

f:=fact(n);

writeln(‘Д? числ??n,?значение факториала =?f)

end.

 

Пуст?n=5, ?? вычислит?5! Ка?же буде?вычислять? факториа?этог?числ? Первый вызо?этой функци?буде?из основной программ? Надо заметить, чт?пр?каждом обращени??функци?буде?появлять? свой набо?локальны?переменных со своими значен?ми, ?данном случае ?переменн? n, для которы?выде?ет? па?ть. ?посл?завершен? работы эт?част?па?ти освобождается, ?переменные удаляют?.

Та?ка?n, то пойдем по ветк?else ?fact присваивае?значение n*fact(n-1), ?? надо умножить 5 на значение функци?fact(4). Поэтом?обращаем? второй ра??этой же функци? но передаем ее ново?значение параметр??4. Та?делаем до те?по? пока не передади?значение равное 1. Тогд?n=1, ?поэтом?значение функци?fact:=1. Таки?образо? n=1 ?эт?услови? по которому процес?вход??следующу?рекурсию заканчивается. Идет возвращени??точк?возврата ?подстановк??оператор присваиван? значен? вычисленно?функци? ?? возвращаем? ?предыдущую функци?для n=2: fact:=n*fact(n-1), значит, fact:=2*1, следовательн? fact(2)=2. ?возвращаем? дальше. Таки?образо? получаем значение fact(5)=120, эт?значение ?присваивается переменной f.

Итак, пр?выполнении рекурсивно?подпрограммы осуществ?ет? многократный перехо?от некоторого текущего уров? организаци?алгоритм??нижнем?уровню последовательн?до те?по? пока, наконе? не буде?получено тривиально?решени?поставленной задачи. ?данном пример?решени?пр?n=1 тривиально, ?? fact=1. Зате?осуществ?ет? возвра?на верхни?уровен??последовательным вычисление?значен? функци?fact.

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

 

ЗАДАНИ?ДЛ?САМОСТОЯТЕЛЬНО?РАБОТЫ

Задача 1.

Составьт?программ?подсчета числ?всех натуральны?чисе? меньши?? квадра?сумм?цифр которы?раве??

Задача 2.

Даны действительные числ?S, T. Составит?программ?вычислен? выражения

, гд?.

Задача 3.

Вычислит?сумм? 1!+2!+3!+ ?+n!, используя функци?вычислен? факториала числ?k!

Задача 4.

Даны координаты вершин многоугольника (?,y1,x2,y2,?x10,y10). Определить ег?периметр (вычисление расстояния межд?вершинам?оформить подпрограммо?.

Задача 5.

Даны координаты трех вершин треугольника АВ??даны координаты четверто?точк?D. Определить, являет? ли эт?точк?внутренней точкой треугольника.

Задача 6.

Даны координаты вершин двух треугольнико? Найт?длин?всех сторон этих треугольнико?

Задача 7.

Дано натурально?числ?n>2. Выяснит? имеется ли сред?чисе?n, n+1, ?, 2n близнецы, ?? просты?числ?разность межд?которыми равн?двум.

Задача 8.

Составит?программ?вычислен? значений функци?Аккерман?для неотрицательны?чисе?n ?m.

Задача 9.

Найт?первые N чисе?Фибоначч? Каждое числ?Фибоначч?равн?сумм?двух предыдущих чисе?пр?услови? чт?первые дв?равн?1 (1, 1, 2, 3, 5, 8, 13, 21, ?, поэтом??обще?виде n-?числ?можн?определить та?

 

КОНТРОЛЬНЫ?ВОПРОС?/strong>

1. Чт?называет? подпрограммо? ?че?состои?сходство ?различие подпрограм?процедур ?подпрограм?функци??языке Turbo Pascal?

 

2. ?че?различие межд?стандартными ?определенным?пользователе?подпрограммами?

 

3. Запишите синтаксическую диаграмм?определения процедур? функци?

 

4. Опишит?последовательность событи?пр?вызове процедур?ил?функци?

 

5. Чт?называет? параметром, ?каково ег?назначение? Формальные, фактически?параметр? их взаимосвязь.

 

6. Каковы отличия параметров-значений от параметров-переменных, особенност?их описан? ?применен?.

 

7. Каковы особенност?параметров-процедур ?параметров-функци?

 

8. Че?отличают? локальны??глобальные параметр? Какова област?их действ??

 

9. Чт?тако?рекурс??

 

10. Даны фрагмент?программ:

? var c,d:integer; ? var c,d:integer;

procedure P(x,y:integer); procedure Q(x:integer; var y:integer);

begin begin

y:=x+1 y:=x+1

end; end;

 

? var c,d:integer;

procedure R(var x,y:integer);

begin

y:=x+1

end;

? для каждой из этих процедур указат? каки?из ее параметров являют? параметрам?значен?ми, ?каки??параметрам?переменным?

? определить, чт?буде?выдано на печать ?следующи?случ??

c:=2; d:=0; P(sqr(?+c, d); writeln(d);

c:=2; d:=0; Q(sqr(?+c, d); writeln(d);

Почему пр?изменени??процедур?параметр?значен? соответствующи?фактически?параметр не ме?ет своего значен?? Чт?надо сделат? чтоб?он ме??значение?

? допустим?ли обращения R(sqr(c)+c, d) ?R(c,d)? Почему невыгодн?об?влять параметр, не ме?ющий? ?процедур? параметром-переменной?

 

11. Чт?буде?напечатано следующе?программой?

? program dem1; ? program dem2;

var x,y:char; var a,b,c,d:integer;

procedure P(x:integer); procedure P(var b:integer; c:integer);

const y:true; var d:integer;

begin begin

writeln(x,??y); a:=5; b:=6; c:=7; d:=8;

end; writeln(a,b,c,d);

procedure Q(x:integer); end;

var x:char; begin

begin a:=1; b:=2; c:=3; d:=4;

x:=succ(y); P(a,b); writeln(a,b,c,d)

y:=?? end.

writeln(x,??y)

end;

begin

x:=’a? y:=??

P(8); writeln(x,??y);

Q;

writeln(x, ??y)

end.