Практикум по программированию на языке Turbo Pascal. Часть 2. Портнягина В.В - 90 стр.

UptoLike

{Исполнимая часть головной программы}
Begin
ClrScr;
WriteLn ('Введи количество членов ряда n');
ReadLn (n);
S: = Sum (n);
WriteLn ('Сумма S =', S: 5);
ReadKey;
End.
Протокол работы программы. Введи количество членов ряда n 10
Сумма S = 55
Опишем работу программы. Операция суммирования бу-
дет повторяться ровно n – 1 раз, поскольку функция Sum об-
ращается n – 1 раз к самой себе, при этом параметр каждый раз
уменьшается на единицу. В конце концов параметр станет рав-
ным 1, и рекурсивные вызовы закончатся, после чего все уже
вызванные функции одна за другой завершат свою работу.
Обратим внимание на следующие обстоятельства. Во-
первых, рекурсивная процедура или функция содержит все-
гда, по крайней мере, одну терминальную ветвь и условие
окончания (If n = 1 Then Sum = l). Во-вторых, при выполне-
нии рекурсивной ветви (Else Sum: = Sum (n – l) + n) процесс
выполнения подпрограммы приостанавливается, но его пе-
ременные не удаляются из стека. Происходит новый вызов
подпрограммы, переменные которой также помещаются в
стек, и т. д. Так образуется последовательность прерванных
процессов, из которых выполняется всегда последний, а по
окончании его работы продолжает выполняться предыдущий
процесс. Целиком весь процесс считается выполненным, ко-
гда стек опустеет, или, другими словами, все прерванные
процессы выполнятся.
Рекурсия полезна, прежде всего, в случаях, когда основ-
ную задачу можно разделить на подзадачи, имеющие ту же
структуру, что и первоначальная задача.
Не следует путать рекурсию с итерацией, которая реа-
лизуется при
помощи циклов.
Большинство алгоритмов можно реализовать двумя спо-
собами: итерацией и рекурсией. Вспомним пример с суммой,
90
    {Исполнимая часть головной программы}
    Begin
    ClrScr;
    WriteLn ('Введи количество членов ряда n');
    ReadLn (n);
    S: = Sum (n);
    WriteLn ('Сумма S =', S: 5);
    ReadKey;
    End.
    Протокол работы программы. Введи количество членов ряда n 10
    Сумма S = 55
    Опишем работу программы. Операция суммирования бу-
дет повторяться ровно n – 1 раз, поскольку функция Sum об-
ращается n – 1 раз к самой себе, при этом параметр каждый раз
уменьшается на единицу. В конце концов параметр станет рав-
ным 1, и рекурсивные вызовы закончатся, после чего все уже
вызванные функции одна за другой завершат свою работу.
    Обратим внимание на следующие обстоятельства. Во-
первых, рекурсивная процедура или функция содержит все-
гда, по крайней мере, одну терминальную ветвь и условие
окончания (If n = 1 Then Sum = l). Во-вторых, при выполне-
нии рекурсивной ветви (Else Sum: = Sum (n – l) + n) процесс
выполнения подпрограммы приостанавливается, но его пе-
ременные не удаляются из стека. Происходит новый вызов
подпрограммы, переменные которой также помещаются в
стек, и т. д. Так образуется последовательность прерванных
процессов, из которых выполняется всегда последний, а по
окончании его работы продолжает выполняться предыдущий
процесс. Целиком весь процесс считается выполненным, ко-
гда стек опустеет, или, другими словами, все прерванные
процессы выполнятся.
    Рекурсия полезна, прежде всего, в случаях, когда основ-
ную задачу можно разделить на подзадачи, имеющие ту же
структуру, что и первоначальная задача.
    Не следует путать рекурсию с итерацией, которая реа-
лизуется при помощи циклов.
    Большинство алгоритмов можно реализовать двумя спо-
собами: итерацией и рекурсией. Вспомним пример с суммой,
                              90