Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
LN15_16 процедури !!!.DOC
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
86.53 Кб
Скачать

Рекурсивний виклик функцій та процедур

Процедура чи функція може бути викликана:

  1. Із тіла головної програми

  2. Із тіла іншої процедури та функції

  3. Із тіла тої ж самої процедури та функції - рекурсія

Приклад: Обчислити хn, n0, ціле за допомогою рекурсії.

program help;

function power(x:real;n:integer):real;

begin

if n=0 then power:=1

else power:=power(х,n-1)*x

end;

{ головна програма }

begin

:

y:=power(4,8);

:

end.

Приклад: обчислити n!.

Program;

var number:integer;

function factorial(value:integer):integer;

begin

if value=0 then factorial:=1

else factorial:=factorial(value-1)*value

end;

begin

readln(number);

if number<0 then writeln(' нема фекторіалу від'ємного числа')

else writeln('факторіал ',number,' дорівнює ',factorial(number))

end.

Приклад: перевести десятькове число у вісімкове шляхом ділення та виведення остач у зворотньому порядку.

Var z:integer;

Procedure convert(z:integer);

Begin

If z>1 then convert(z div 8);

Write(z mod 8:1);

End;

Begin

Readln(z);

Convert(z);

End.

Перехрестна рекурсія

Виникає, якщо обчислюються взаємно пов'язані функції

f(х)=p(х,g(х))

g(х)=t(х,f(х))

Виникає конфлікт: як звернутись до функції, яка буде описана після тої, що її викликає (звернення, що передує описуванню, неможливе у мові Паскаль). Конфлікт вирішується за допомогою випереджаючого описування, якe містить заголовок функції, після якого вживається службове слово forward:

{випереджаюче описування: }

function <ім'я>(<формальні параметри>):<тип результату>;forward;

<iнші процедури та функції>

{ саме описування функції }

function <ім'я>;

<тіло функції>

Приклад: Знайти всі прості числа, що передують наданому n

program;

function next(i:integer):integer;forward;

function prin(j:integer):boolean;

{ prim=true, якщо j - просте; інакше - false }

var k:integer;

begin

k:=2;

while (k*k<=j)and(j mod k<>0) do

k:= next (k);

{ k пробігає прості числа від 2 до j, перевіряючи, чи є це число дільником }

if j mod k=0 then prim:=false

else prim:=true

end;

function next;

var l:integer;

begin

l:=i+1;

while not prim(l) do l:=l+1;

next:=l;

end;

{ головна програма }

begin

readln(n);

for i:=2 to n do

if prim(і) then writeln(i:10)

else writeln(i:3)

{ виведення у два стовпчики }

end.

Процедури

<заголовок>:

procedur <ім'я> [(<список формальних параметрів>)];[forward;]

<тіло процедури>

Правила описування формальних параметрів та використання випереджуючого описування при організації рекурсії такі ж самі, як і для функції.

Різниця:

- у зверненні

- у випадку використання процедури як початкові данні так і результати повинні бути передані як парамети.

Приклад: визначити середнє

а) за допомогою функції

program first;

var x,y:real;

function midle(a,b:real):real;

begin

midle:=(a+b)/2;

end;

begin

readln(x,y);

writeln(midle(x,y):8:2);

end.

в) за допомогою процедури

program second;

var x,y,m:real;

procedure midle(a,b:real;var mi:real);

begin

mi:=(a+b)/2;

end;

begin

readln(x,y);

midle(x,y,m);

writeln(m:8:2);

end.

Приклад:виконати множення матриць A(m,n),B(n,k), введення, виведення та множення оформити у вигляді процедур.

Program mul;

Type mat=array[1..50,1..50] of real;

Var a,b,c:mat;

m,n,k,i,j:byte;

Procedure inpm(var x:mat:m,n:byte);

{введення матриці}

Var i,j:byte;

Begin

{введення розміру матриці та її елементів}

write(‘введіть розмірність, m,n ‘);

readln(m,n);

{введення матриці по рядках}

for i:=1 to m do

begin

for j:=1 to n do

read(x[i,j]);

readln;

end;

end;

procedure outpm(x:mat;m,n:byte);

{виведення матриці}

var i,j:byte;

begin

for i:=1 to m do begin

for j:=1 to n do

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

writeln;

end;

end;

procedure mul(m,n,k:byte;a,b:mat;var c:mat);

{множення A(m,n)*B(n,k)=C(m,k)}

var i,j,p:byte;

begin

for i:=1 to m do

for j:=1 to k do begin

c[i,j]:=0;

for p:=1 to n do

c[i,j]:=c[i,j]+a[i,p]*b[p,j];

end;

end;

{головна програма}

begin

inpm(a,m,n);

inpm(b,n,k);

mul(m,n,k,a,b,c);

outpm(c,m,k);

end;

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