ВУЗ:
Составители:
Рубрика:
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
- …
- следующая ›
- последняя »
