ВУЗ:
Составители:
Рубрика:
27
procedure reverse (n:word);
begin {прямая рекурсия}
write(n mod 10);
if (n div 10) <>0 then reverse(n div 10);
end;
var i:word;
begin
writeln(′ввод числа′);
readln(i);
reverse(i); writeln;
end.
RUN
ввод числа 351
153
Рассмотрим работу этой процедуры для числа n=351. Оператор
write(n mod 10) выдаёт в файл вывода output, остаток от деления ]351:10[=1,
оператор if(n div10)<>0 then reverse(n div 10) проверяет целую часть частного
]351:10[=35. Если целая часть <>0, то с этим значением 35 идет вновь
обращение к процедуре reverse. Создаётся новая копия тела
процедуры и для
нового параметра (n div 10) выделяется новая локальная переменная, которой
передается значение 35. Оператор write(n mod 10) выдаёт в файл output
остаток от деления 35/10=5, затем производится проверка ]35/10[=3≠0 снова
вызывается процедура reverse с числом n=3, оператор write(n mod 10) выдаёт
остаток от деления 3:10=ост.3, затем проводится проверка ]3/10[=0,
процедура reverse завершает свою работу.
Таким образом, однократное обращение в основной программе к
процедуре reverse вызвало
трёхкратное её срабатывание.
Условие полного окончания работы рекурсивных процедур или
функций должно находится в самой подпрограмме, иначе произойдёт
зацикливание.
Рекурсивные подпрограммы имеют одну из двух форм: прямую
рекурсию и косвенную рекурсию.
При прямой рекурсии сама подпрограмма содержит вызов самой себя.
В случае косвенной рекурсии одна подпрограмма, например, А,
содержит вызов другой подпрограммы В, которая либо сама либо
посредством других подпрограмм вызывает подпрограмму А.
В случае косвенной рекурсии возникает проблема:
как и где
описывать вызываемую подпрограмму. По правилам языка Турбо Паскаля
28
каждый вызываемый модуль (процедура, функция, массив, переменная, и
т.п.) должен быть описан до его вызова. Но если А вызывает В, а В вызывает
А, то получается замкнутый круг. Для устранения подобных ситуаций
следует использовать предварительное описание одного из
рекурсивных
модулей.
Предварительное описание рекурсивных модулей:
Директива Forward – указывает компилятору, что текст процедуры В
находится ниже.
Аналогично описывается и функция, т.е. к заголовку функции
добавляется ключевое слово forward:
Список формальных параметров и тип результата функции
включается только в это предварительное описание и опускается в заголовке
при последующем описании тела функции.
Пример:
Функция А вызывает функцию В, которая вызывает функцию А.
function B(x:integer):real; forward;
function A(y:integer):real;
var I:integer;
begin
forward
p
rocedure
Имя процедуры
Список
формальных
па
р
амет
р
ов
( )
; ;
forward
function
Имя
фу
нк
ц
ии
Список
формальных
па
р
амет
р
ов
( )
;
;
:
Тип
значения
procedure reverse (n:word); каждый вызываемый модуль (процедура, функция, массив, переменная, и begin {прямая рекурсия} т.п.) должен быть описан до его вызова. Но если А вызывает В, а В вызывает write(n mod 10); А, то получается замкнутый круг. Для устранения подобных ситуаций if (n div 10) <>0 then reverse(n div 10); end; следует использовать предварительное описание одного из рекурсивных var i:word; модулей. begin writeln(′ввод числа′); readln(i); reverse(i); writeln; Предварительное описание рекурсивных модулей: end. Список RUN Имя процедуры ввод числа 351 procedure ( формальных ) параметров 153 Рассмотрим работу этой процедуры для числа n=351. Оператор write(n mod 10) выдаёт в файл вывода output, остаток от деления ]351:10[=1, оператор if(n div10)<>0 then reverse(n div 10) проверяет целую часть частного ; forward ; ]351:10[=35. Если целая часть <>0, то с этим значением 35 идет вновь Директива Forward указывает компилятору, что текст процедуры В обращение к процедуре reverse. Создаётся новая копия тела процедуры и для находится ниже. нового параметра (n div 10) выделяется новая локальная переменная, которой Аналогично описывается и функция, т.е. к заголовку функции передается значение 35. Оператор write(n mod 10) выдаёт в файл output добавляется ключевое слово forward: остаток от деления 35/10=5, затем производится проверка ]35/10[=3≠0 снова вызывается процедура reverse с числом n=3, оператор write(n mod 10) выдаёт Список Имя остаток от деления 3:10=ост.3, затем проводится проверка ]3/10[=0, function функции ( формальных ) : процедура reverse завершает свою работу. параметров Таким образом, однократное обращение в основной программе к процедуре reverse вызвало трёхкратное её срабатывание. Тип Условие полного окончания работы рекурсивных процедур или значения ; forward ; функций должно находится в самой подпрограмме, иначе произойдёт зацикливание. Список формальных параметров и тип результата функции Рекурсивные подпрограммы имеют одну из двух форм: прямую включается только в это предварительное описание и опускается в заголовке рекурсию и косвенную рекурсию. при последующем описании тела функции. При прямой рекурсии сама подпрограмма содержит вызов самой себя. В случае косвенной рекурсии одна подпрограмма, например, А, Пример: содержит вызов другой подпрограммы В, которая либо сама либо Функция А вызывает функцию В, которая вызывает функцию А. посредством других подпрограмм вызывает подпрограмму А. function B(x:integer):real; forward; В случае косвенной рекурсии возникает проблема: как и где function A(y:integer):real; описывать вызываемую подпрограмму. По правилам языка Турбо Паскаля var I:integer; begin 27 28
Страницы
- « первая
- ‹ предыдущая
- …
- 12
- 13
- 14
- 15
- 16
- …
- следующая ›
- последняя »