русс | укр

Мови програмуванняВідео уроки php mysqlПаскальСіАсемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование


Linux Unix Алгоритмічні мови Архітектура мікроконтролерів Введення в розробку розподілених інформаційних систем Дискретна математика Інформаційне обслуговування користувачів Інформація та моделювання в управлінні виробництвом Комп'ютерна графіка Лекції


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


Дата додавання: 2014-11-27; переглядів: 877.


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

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

Рекурсивний виклик може бути прямим і непрямим. При непрямому виклику підпрограма звертається до себе опосередковано шляхом виклику другої підпрограми, в якій міститься звернення до першої. У цьому випадку використовується директива FORWARD.

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

Приклад.Обчислити значення виразів:

 

, .

 

Для розв’язку задачі командою File!New Application створимо новий проект. Встановимо формі заголовок Caption = Рекурсивне обчислення виразів та присвоїмо їй програмне ім’я Name = FROV. Командою File!Save All запишемо програмний модуль під іменем ULABR10_1.pas, а проект – LAB10_1.dpr.

Розробимо форму для введення початкових даних і виведення результату Для цього розмістимо на формі один компонент Edit для введення початкових даних і два для виведення результатів. Присвоїмо цим компонентам програмні імена Edit1, Edit2, Edit3, встановлені за замовчуванням (властивість Name), і очистимо їм значення властивості Text.

Пояснення до цих компонентів зробимо за допомогою компонента Label (властивість Caption).

Крім цього, розмістимо на формі дві керуючих кнопки (компонент Button) з написами Обчислити та Вихід (властивість Caption) і програмними іменами Button1, Button2 (властивість Name за замовчуванням) (Рис !0.1).

Обробники кнопок Обчислити і Вихід містяться у програмному модулі ULABR10_1.

 

 


Рис !0.1. Форма Рекурсивне обчислення виразів.

 

{ Обробник кнопки Обчислити }

procedure TFOVR.Button1Click(Sender: TObject);

VAR n, i: integer;

s1,s2: double;

{Рекурсивні функції обчислення коренів}

Function Kor1(n: integer ): double;

begin

if n=1 then result:=1

else result:=sqrt(n+Kor1(n-1));

end;

Function Kor2(i, n: integer ): double;

begin

if i=n then result:=sqrt(n)

else result:=sqrt(i+Kor2(i+1,n));

end;

begin

{Введення початкових даних}

n:=StrToInt(Edit1.Text);

{Обчислення коренів}

s1:=Kor1(n);

s2:=Kor2(1,n);

{Виведення результатів}

Edit2.Text:=FloatToStr(s1);

Edit3.Text:=FloatToStr(s2);

end;

{ Обробник кнопки Вихід }

procedure TFOVR.Button2Click(Sender: TObject);

begin

Close;

end;

 

Тепер командою Run!Run проект можна запустити на виконання. По завершенню компіляції потрібно ввести початкові дані і натиснути кнопку Обчислити. Результати обчислення приведені на Рис 10.1. Для завершення роботи програми потрібно натиснути кнопку Вихід.

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

Приклад. Для заданого обчислити значення суми

 

, де

 

Для розв’язку задачі командою File!New Application створимо новий проект. Встановимо формі заголовок Caption = Рекурсивні підпрограми та присвоїмо їй програмне ім’я Name = FR. Командою File!Save All запишемо програмний модуль під іменем ULAB10_2.pas, а проект – LAB10_2.dpr.

Аналогічно як у попередньому прикладі розробимо форму для введення початкових даних і виведення результату (Рис. 10.2).

Обробники кнопок Обчислити і Вихід містяться у програмному модулі ULABR10_2 і мають вигляд:

 

{ Обробник кнопки Обчислити }

procedure TFR.Button1Click(Sender: TObject);

VAR n: integer;

s: double;

{Попередній опис функції Ak}

Function Ak(k: integer ): double; FORWARD;

{Функція обчислення Bk}

Function Bk(k: integer ): double;

begin

if k=1 then result:=1

else result:=sqr(Ak(k-1))+sqr(Bk(k-1));

end;

{Функція обчислення Ak}

Function Ak(k: integer ): double;

begin

if k=1 then result:=1

else result:=sqrt(Ak(k-1))+sqrt(Bk(k-1));

end;

{Функція обчислення факторіалу}

Function Fact(k: integer ): longint;

begin

if (k=0) or (k=1) then result:=1

else result:=Fact(k-1)*k;

end;

{Функція обчислення суми}

Function Sum(k: integer ): double;

begin

if k=1 then result:=2

else result:=Sum(k-1)+(Ak(k)+Bk(k))/Fact(k);

end;

begin

{Введення початкових даних}

n:=StrToInt(Edit1.Text);

{Обчислення суми}

s:=Sum(n);

{Виведення результату}

Edit2.Text:=FloatToStr(s);

end;

{ Обробник кнопки Вихід }

procedure TFR.Button2Click(Sender: TObject);

begin

Close;

end;

 


Рис. 10.2. Форма Рекурсивні підпрограми

 

Результат роботи програм наведений на Рис. 10.2.


<== попередня лекція | наступна лекція ==>
Флеш память | Полигональное моделирование монстра в 3d max


Онлайн система числення Калькулятор онлайн звичайний Науковий калькулятор онлайн