Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Турбо Паскаль (паскалер).doc
Скачиваний:
19
Добавлен:
03.05.2019
Размер:
2.65 Mб
Скачать

Занятие 2. Примеры задач рекурсивного решения в текстовом и графическом режимах.

Задача 1. Нахождение n-го члена арифметической прогрессии

(an=a1+d*(n-1)-формула n-го члена арифметической прогрессии).

Program Progressiy;

Var

a1, d, k: real;

n: integer;

{- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -}

Function Arif (a1, d: real; n: integer): real;

Begin

if n = 1

then

Arif := a1

else

Arif := Arif(a1, d, n - 1) + d;

End;

{- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -}

Begin

writeln('Задайте первый член прогрессии');

readln(a1);

writeln('Задайте разность арифметической прогрессии');

readln(d);

writeln('Арифметическая прогрессия ', Аrif(a1, d, n) : 4 : 2);

End.

Задание. Составьте программу

a) нахождения n-го члена геометрической прогрессии,

б) нахождения суммы членов арифметической прогрессии,

в) нахождения суммы членов геометрической прогрессии,

г) нахождения n-го члена ряда Фибоначчи.

Задача 2. Вложенность квадратов.

Program KaparovS;

Uses

Crt, Graph;

Var

x, y, x1, y1, x2, y2, x3, y3, n, d, a, b : integer

{- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -}

Procedure Pic(x, y, x1, y1, x2, y2, x3, y3, n, d : integer);

Var

k, j : integer;

Begin

if n >=1

then

begin

Line(x, y, x1, y1);

Line(x1, y1, x2, y2);

Line(x2, y2, x3, y3);

Line(x3, y3, x, y);

j := x;

k := y;

x := (x1-x) div 2 + x;

y := (y1-y) div 2 + y;

x1 := (x2-x1) div 2 + x1;

y1 := (y2-y1) div 2 + y1;

x2 := (x3-x2) div 2 + x2;

y2 := (y3-y2) div 2 + y2;

x3 := (j-x3) div 2 + x3;

y3 := (k-y3) div 2 + y3;

Pic(x, y, x1, y1, x2, y2, x3, y3, n-1, d);

end;

End;

{- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -}

Begin

ClrScr;

write ('Введите количество повторений: ');

readln (n);

x := 0;

y := 0;

x1:= 400;

y1 := 0;

x2:= 400;

y2 := 400;

x3:= 0;

y3 := 400;

a : Detect;

InitGraph(a, b, 'D:\TP7\BGI');

ClearDevice;

Setcolor(Green);

Pic(x, y, x1, y1, x2, y2, x3, y3, n, d);

readln;

CloseGraph;

End.

Задание. Наберите программу и просмотрите ее действие. Дополните программу комментарием. По желанию улучшите алгоритм.

Творческое задание. Придумайте и решите задачу на демонстрацию рекурсии в графическом режиме.

Занятие 3. Косвенная рекурсия.

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

Образно косвенную рекурсию можно описать так. Перед зеркалом 1 стоит зеркало 2, в котором отражается само зеркало 1. В последнем видно зеркало 2 и т.д.

Приведем пример программы, иллюстрирующей косвенные рекурсивные вызовы процедур. В этой программе процедуры Rec1 и Rec2 рекурсивно вызывают друг друга, поочередно уменьшая свои фактические параметры. Легко видеть, что обе процедуры работают с одной глобальной переменной А, которая передается в них по ссылке. Критерием завершения работы является обращение этой переменной в ноль.

Обратите внимание, что в программе необходимо предварительное определение второй процедуры Rec2, так как ее вызов встречается в процедуре Rec1, т.е. перед ее полным описанием.

Program KosvRecurs;

Var

A : integer;

Procedure Rec2 (Var Y:integer); Forward;

{- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -}

Procedure Rec1 (Var X:integer);

Begin

X := X-1;

if X>0

then

Rec2;

writeln (X)

End;

{- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -}

Procedure Rec2 (Var Y:integer);

Begin

Y := Y div 2;

if Y>2

then

Rec1;

writeln (Y)

End;

{- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -}

Begin

A := 15;

Rec1(A);

End.

Творческое задание. Придумайте и решите задачу на демонстрацию косвенной рекурсии в графическом режиме.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]