Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Pascal.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
3.44 Mб
Скачать

1.5 Основні відмінності між функціями і процедурами

  1. Функція, як правило, повертає одне єдине значення, наприклад Sin(х). Процедура може повертати складні структури, наприклад масиви.

  2. Заголовок функції (її перший рядок) завершується вказівкою типу значення, що повертається (наприклад, real, integer тощо). У заголовку процедури така інформація не потрібна.

  3. В кінці тіла функції їй присвоюється те значення, для обчислення якого вона призначена, наприклад, Sum_Mas:=5;

  4. Функція може бути операндом математичного виразу. Процедура не може бути частиною виразу.

2 Рекурсивні функції

Рекурсивний об’єкт – це об’єкт, який частково визначається через самого себе.

Ідеї рекурсії відомі дуже давно і використовуються у багатьох областях науки.

Рекурсією у програмуванні називається алгоритмічна конструкція, де підпрограма викликає сама себе. Рекурсія дозволяє записати циклічний алгоритм, не використовуючи цикл.

Стек – це структура даних в оперативній пам'яті, де дані зберігаються й витягаються за принципом «останнім прийшов, першим пішов». При обчисленні рекурсивних функцій система спочатку формує стек і заносить туди необхідні для обчислення дані. На наступному етапі вона робить обчислення, витягаючи дані у зворотному порядку.

Приклад 1:

Розглянемо функцію факторіала n!, яка визначається як добуток перших n цілих чисел: n!=1*2*3*…* n.

Такий добуток звичайно можна легко обчислити за допомогою оператора циклу for.

program Factorial;

var fact:longint;

n,i:integer;

begin

write(‘Ввести число n’);

readln(n);

fact:=1;

for i:=1 to n do

fact:=fact*i;

writeln(‘Факторіал n!=’, fact);

end.

Але визначити факторіал можна і за допомогою рекурсії:

program Factorial;

var

n:integer;

function Fact(i:integer):longint;

begin

if i=1 then Fact:=1

else Fact:=i*(i-1);

end;

begin

write(‘Ввести число n’);

readln(n);

writeln(‘Факторіал n!=’, fact(n));

end.

Зміст та міцність рекурсивного визначення, а також його головне призначення, міститься в тому, що воно дозволяє за допомогою кінцевого виразу визначити нескінченну множину об’єктів. Аналогічно, за допомогою кінцевого рекурсивного алгоритму можна визначити нескінченне обчислення, при цьому алгоритм не буде містити повторів фрагменту тексту.

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

При використанні рекурсії необхідно правильно вказувати умови закінчення «циклічних» обчислень.

Приклад 2:

Процедура, яка буде нескінченно виводити на друк рядок довільного тексту.

program RecInf1;

procedure Druk1;

begin

writeln(‘Мова програмування Pascal’);

Druk1;

end;

begin

Druk1;

end.

Однак, що оператор виклику процедури поставите перед виводом тексту, то така програма нічого не надрукує, хоча й буде працювати так само нескінченно, як і перша.

program RecInf2;

procedure Druk2;

begin

Druk2;

writeln(‘Мова програмування Pascal’);

end;

begin

Druk2;

end.

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

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

Число рекурсивних викликів у кожний конкретний момент часу називають поточний рівнем рекурсії.

Головною вимогою до рекурсивних процедур є те, що виклик рекурсивної процедури повинен виконуватись за умовою, яка на деякому рівні рекурсії стане хибною.

Структура рекурсивної процедури може приймати три різні форми:

1. Форма з виконанням дій до рекурсивного виклику (з виконанням дій на рекурсивному спуску).

procedure Rec;

begin

S; {множина операторів}

if умова then Rec;

end;

2. Форма з виконанням дій після рекурсивного виклику (з виконанням дій на рекурсивному поверненні).

procedure Rec;

begin

if умова then Rec;

S; {множина операторів}

end;

1. Форма з виконанням дій як до, так і після рекурсивного виклику (з виконанням дій як на рекурсивному спуску, так і на рекурсивному поверненні).

procedure Rec;

begin

S1; {множина операторів}

if умова then Rec;

S2; {множина операторів}

end;

або

procedure Rec;

begin

if умова then Rec;

begin

S1; {множина операторів}

Rec;

S2; {множина операторів}

end;

end;

Приклад 3:

Особливості застосування підпрограм демонструє програма, яка виконує наступні задачі.

  1. Введення цілочисельних одновимірних масивів n_Mas і m_Mas, що складаються відповідно з n і m членів.

  2. Виведення на екран початкових масивів.

  3. Сортування початкових масивів за збільшенням значень їх елементів методом лінійного сортування.

  4. Виведення на екран відсортованих масивів.

  5. Обчислення і виведення на екран суми сум елементів початкових масивів.

program Proc_Fun; {Ілюстрація застосування процедур і функцій}

uses Crt;

const {глобальні константи}

n=5;{Довжина масиву n_Mas}

m=7;{Довжина масиву m_Mas}

tурe {глобальні типи}

Int_m=1..m;{оскільки m> n}

Mas_Type=array[Int_m] of integer;

var {глобальні або нелокальні змінні}

n_Mas,m_Mas:Mas_Type;

{опис підпрограм}

procedure Chtenie_Dan(Var Mas:Mas_Type;Dlina:Int_m);

{Mas – масив, параметр-змінна; Dlina – параметр-значення}

var {локальні змінні}

i:Int_m; {номер поточного елементу масиву}

begin

writeln('Введіть поелементно масив з ',Dlina,' цілих чисел');

for i:=l to Dlina do

read(Mas[i]);

writeln; {пропуск рядка}

end; {Chtenie_Dan}

procedure Pechat_Mas(Mas:Mas_Type;Dlina:Int_m);

{Mas – параметр-значення; Dlina – параметр-значення}

var i:Int_m;

begin

for i:=1 to Dlina do

write(Mas[i]:4);

writeln; {для друку подальших повідомлень з нового рядка}

end; {Pechat_Mas}

Procedure Sort(Var Mas:Mas_Type;Dlina:Int_m);

{лінійне сортування масиву за збільшенням елементів}

var i, Candidat:Int_m;

x:Integer;

begin

for i:=1 to Dlina - 1 do

for Candidate 1+1 to Dlina do

if Mas[i]>Mas[Candidat]

then

begin

x:=Mas[i];

Mas[i]:=Mas[Candidat];

Mas[Candidat]:=x;

end; {then}

end; {Sort}

function Sum_Mas(Mas:Mas_Type;Dlina:Int_m):longlnt {особливість функції};

{сумування елементів масиву}

var i:Int_m;

S:longlnt;

begin

S=0;

for i:=1 to Dlina do

S:=S+Mas[i];

Sum_Mas:=S; {особливість функції}

end; {Sum Mas}

procedure Sum_Sum_Pechat;{процедура без параметра}

begin

writeln('Сума сум масивів: ',Sum_Mas(n_Mas,n) + Sum_Mas(m_Mas,m));

end;{Sum_Sum_Pechat}

begin

clrscr;

Chtenie_Dan(n_Mas,n);

Chtenie_Dan(m_Mas,m);

writeln('Початковий масив из',n,' членів:');

Pechat_Mas(n_Mas,n);

writeln('Початковий масив з ',m,' членів:');

Pechat_Mas(m_Mas,m);

Sort(n_Mas,n);

Sort(m_Mas,m);

writeln('Масиви після сортування:');

Pechat_Mas(n_Mas,n);

Pechat_Mas(m_Mas,m);

Sum_Sum_Pechat;

readln;

readln;

end. {Proc_Fun}

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