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

2. Особенности выполнения рекурсивных алгоритмов

Учш!п'.и>: "Рассмотрим программу. » результате вы­полнения которой па экран выводится текст истории о попе и ею собаке ("У иона была собака...").

На доске записывается текст программы:

Program History; Procedure Print; Begin

Writel.il ('У попа Пыла еоолкл,'); Writ о In ('Он ее люйил.1);

1 Or

ат. nrursio — ио;шр;111ц.'нио. — Прим. \к\\.

2 Почему *это нлжно, п

Wri tel n ('Она съела кусок нтм ') ;

WriteIn ('Он ее убил.');

Writeln ('Убил и закопал');

Writeln {'И на могиле написал:');

Print; (Рекурсивный вызов процедуры Print!

Readkey {Ожидание нажатия люСюй клавиши) End; BEGIN {Основной программы}

Print END.

Учитель: "Сколько pa.i текст истории будет нынелеп на экран?".

В xcv\e обсуждения необходимо рассказать (напом­нить), что при каждом ны;юиеиспомоп11\*льной процедуры (функции) для нее отводится место в оперативной памя­ти, которое "освобождается" после завершения ее (про-цедуры) работы. Но если но вепомогаа'лыюй процедуре имеется рекурсия, то вы.ювы вспомогательных прмодур будут продолжаться до тех пор, когда выделенное место в памяти будет исчерпано (и результате на экране появится сообщение об ошибке, связанной с этим фактом)'.

Чтобы устранить этот недостаток, необходимо так оформлять процедуры (функции), чтобы рекурсивные вызовы осуществлялись по условию, которое когда-то станет ложным.

Например, в рассмотренной программе должна быть описана процедура с параметром и использован условный оператор: Program History; Procedure Print(Var n: byte); Begin

If n > 0 Then Begin

n := n - 1

Writeln ('У попа была собака, ');

End End; BEGIN (Основной программы}

Print(20) END.

Для объектов с рекурсивным определением при ложном значении условия должна выполняться базовая часть определения (см. функцию Рдля нахождения фак­ториала заданного числа п в разделе 1).

Последовательность рекурсивных вызовов функции F при п = 3 показана пи рис. 2.

Выполнение оператора х := F(3) в основной части программы требует первого обращения к функции Р. В оперативной памяти выделено место для размещения этой функции, а параметру п будет присвоено значе­ние 3. Начнется выполнение функции. Так как п> 1, то будет выполнена ветвь условного оператора, содержа­щая рекурсию:

F :== 3 * F(2)

Оснопияп■

fir

П. npiirpsl

It

S)

I

6

3

n

Рис. г

В результате будет опять вызвана функция F и ей бу­дет передано значение п = 2. При выполнении функции также "сработает" рекурсивная ветвь:

F := 2 * F(l)

что потребует очередного размещения в памяти функ­ции ? с параметром п = 1. При ее выполнении рекур­сивного вызова не будет (согласно базовой части f = 1). Найденное значение F(l) = 1 будет передано в функцию, откуда была вызвана функция* F с параметром п = 1, после чего место, выделенное под последнюю функцию, осво­бодится1. В результате будет рассчитано значение F(2) = 2, которое также "вернется" в вызывающую функцию для определения значения F(3). Это значение F(3), равное 6, будет возвращено в основную часть программы и при­своено переменной х.

От редакции. Механизм организации работы рекурсивных процедур (функций) подробно описан в статье ЕА Е^-мчна Cwk , опубликованной в "Информатике" № 2-4/2008.

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