Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛР5 (Процедуры и функции).doc
Скачиваний:
6
Добавлен:
04.12.2018
Размер:
150.02 Кб
Скачать

2.5 Рекурсивная подпрограмма

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

Простой пример рекурсивной функции – вычисление факториала:

Пример 3. Вариант функции, рекурсивно вычисляющей факториал.

functicon Factorial(m : Byte) : Longint;

begin

if (m=0) or (m=1) then Factorial := 1

else Factorial := m * Factorial(m-1);

end;

3 Содержание работы

3.1   Реализовать следующую программу: Даны отрезки а, b, с. Если из этой тройки отрезков можно построить треугольник, то вычислить его площадь, в противном случае вывести на печать сообщение "нельзя построить треугольник".

 Пример 1. Даны отрезки а, b, с. Если из этой тройки отрезков можно построить треугольник, то вычислить его площадь, в противном случае вывести на печать сообщение "нельзя построить треугольник".

 Решение.

Program Square;

Var a,b,c,S : Real;

{процедура нахождения площади треугольника по формуле Герона}

Procedure Streug(x,y,z:Real;Var ss:Real);

Var p:Real;

Begin

p:=(x+y+z)/2;

ss:=sqrt(p*(p – x)*(p – y)*(p – z));

End;

Begin

Writeln('Введите длины 3-х отрезков');

Write('a='); Readln(a);

Write('b='); Readln(b);

Write('c='); Readln(c);

if (a>0) and (b>0) and (c>0) and (a+b>c) and (a+c>b) and (b+c>a){контроль ввода}

Then Begin

Streug(a,b,c,S); {вызов процедуры}

Writeln('Площадь S = ', S) {вывод результата}

End

Else Writeln('нельзя построить треугольник');

End.

3.2       Выполнить свой вариант задания на функции из приложения А и Б.

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

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

Все необходимые данные должны передаваться подпрограммам в качестве параметров; все величины, используемые только внутри подпрограмм, должны быть описаны как локальные. Заполнение массивов следует производить с помощью датчика случайных чисел. Например, для заполнения матрицы случайными числами от -20 до 20 и вывода ее элементов на экран можно создать следующую функцию:

Procedure InMatr(Var x:TArray; row,col:Byte);

Var i,j:Byte; {Описание локальных переменных}

Begin {Формирование случайной матрицы и ее вывод на экран}

Randomize;

For i:=1 to row do Begin

For j:=1 to col do Begin

X[i,j]:=Random(41)-20; {x[i,j] формируется случайно}

Write(x[i,j]:7:2,' '); {X[i,j] выводится на экран}

End;

Writeln;

End;

End;

Тогда в основной программе вызов этой процедуры будет выглядеть следующим образом:

Program prog;

Type TArray=Array[1..10,1..10] of Real;

Var A: TArray; n,m : Byte;

{описание необходимых процедур и функций}

BEGIN {глобальный блок – основная программа}

Write('Введите число строк и столбцов матрицы А (не более 10) ');

Readln(n,m);

{вызов процедуры формирования и печати матрицы}

InMatr(A,n,m);

. . .

Процедура печати матрицы может выглядеть следующим образом:

Procedure Print(x:TArray; row,col:Byte);

Var i,j:Byte; {Описание локальных переменных}

Begin

For i:=1 to row do Begin

For j:=1 to col do Begin

Write(x[i,j]:7:2,' ');

End;

Writeln;

End;

End;

3.5       Сохранить все результаты в файлы и оформить отчет.