Основы алгоритмизации и программирования. Часть третья. Структурированные типы данных. Асламова В.С - 14 стр.

UptoLike

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[=30 снова
вызывается процедура 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