Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
50
Добавлен:
07.02.2016
Размер:
104.45 Кб
Скачать

If умова then rec;

end;

Рекурсія другого виду:

procedure Rec;

begin

If умова then rec;

S;

end;

Ці форми можна також комбінувати. Взагалі, потреба в використанні тій чи іншій формі рекурсії виникає, коли треба обробляти складні структури даних. При вивченні цих структур ми ще не раз будемо вертатися до поняття рекурсії. А зараз, розглянувши вже відому задачу про знаходження факторіалу, розглянемо ці дві форми [8]/

Прикладвикористання рекурсії на спускі:

function Fact_dn(Mult: Longint; I, m: Integer): Longint;

Begin

Mult :=Mult*I; {Накопичення факторіалу стоїть до оператора рекурсивного виклика.Тобто обчислення виконується при спуску.}

if I = m then Fact_Dn := Mult

else Fact_Dn := Fact_Dn ( Mult, I+1, m )

end;

Прикладвикористання рекурсії на підйомі:

function Fact _Up( I := integer) : Longint ;

Var

Mult : Longint;

Begin

if I := 1 then Mult := 1

else Mult := Fact_Up ( I-1 ) ;

Fact_Up := Mult*I {Накопичення факторіалу стоїть після оператора рекурсивного виклику. Тобто обчислення виконується при вертанні.}

end;

Класичною задачею на використання рекурсії є задача про Ханойську вежу[5]:

На дошці є три голки: 1, 2, 3. На голці 1 розміщується башта з n дисків; нижній диск має самий великий діаметр, а діаметр кожного наступного менше попереднього. Зо один хід з будь-якої голки можна взяти верхній диск та перемістити на іншу, але дозволено класти диск лише на дошку або на диск більшого діаметра. Треба перемістити всю башту з голки 1 на голку 3.

Ця гра називається “Ханойські вежі”, тому що за легендою цю гру з n=64 дисками почали більш ніж 1000 років тому назад монахи в одному монастирі близько Ханою у В’єтнамі. Коли вони закінчать цю гру, настане кінець світу.

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

Для переносу башти з n дисків з голки 1 на голку 3 треба перенести башту з n-1 дисків на голку 2, даліперенести нижній диск на голку 3 та перенести башту з голки 2 на голку 3.

program Hantow;

Var n:integer;

procedure disk(f,t:integer);

begin

writeln(f, ‘->’, t);

end;

procedure tow(h:integer; f,t,v:integer);

begin

if h=1 then disk(f,t)

else

begin

tow(h-1,f,v,t);

disk(f,t);

tow(h-1,v,t,f);

end

end;

begin

readln(n);

tow(n,1,3,2);

end.

Глибина рекурсії дорівнює значенню n. Нехай n=3. Хід виконання програми див. на рис. 3.1.

Для перенесення трьох дисків з голки a на голку bтреба виконати 7 переміщень дисків за допомогою голки с. Таким чином, для перенесення n дисків треба виконати 2n–1 переміщень. За легендою треба перемістити n=64 диски. це 1,844674407371e+19 –1 переміщень. Якщо припустити, що кожну секунду монахи переносять один диск, то для перенесення такої башти треби коло 1015 років. Навіть якщо комп’ютер зможе кожну секунду виводити на екран 100 000 позначень перенесень, то знадобиться 1010 років. Так що ще дуже далеко до кінця світу.

Існує також подвійна рекурсія. Прикладом є функція Акермана:

Висока рекурсивність цієї функції використовується для перевірки властивості компіляторів або обчислювальних машин виконувати рекурсію. Ця функція, що була названа на честь У. Акермана, є прикладом функції, що є взагалі рекурсивною, а не примітивно рекурсивною. Тому її значення дуже швидко зростає з зростанням m.

Нехай m=4,n=2.

Тоді процес виклику функції Акермана виглядає таким чином (див рис. 3.2.).

Виходячи з приведено шляху рекурсивного виклику функції Акермана отримаємо наступну таблицю:

А

0

1

2

3

4

5

6

7

8

9

10

11

12

13

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

2

3

5

7

9

11

13

15

17

19

21

23

25

27

29

3

5

13

21

29

37

45

53

61

69

77

85

93

101

109

4

13

При зворотному шляху функції маємо таке:

A(0,1)= 1+1=2;

A(1,0)= A(0,1) =2;

A(1,1)= A(0, A(1,0))= A(0,2) =3;

A(2,0)= A(1,1)=3;

A(2,1)= A(1,A(2,0))=A(1,3)=A(0,A(1,2))=A(0,A(0,A(1,1)))=A(0,A(0,3))=A(0,4)=5;

Зауважимо, що А(4,1)=А(3,13) .

Соседние файлы в папке конспект лекцій 1 паск