Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл: Источник:
Скачиваний:
313
Добавлен:
04.03.2014
Размер:
154.11 Кб
Скачать

12 Рекурсивные подпрограммы в языке Паскаль: организация, примеры использования. Взаимная рекурсия. Директива forward.

{Если вам попадёт на экзамене этот вопрос(forward), попросите Юрия Евтиховича заменить вам этот вопрос}

Все подпрограммы в языке Паскаль (и функции, и процедуры) являются рекурсивными. Это означает, что внутри подпрограммы можно обращаться к самой подпрограмме. Однако, чтобы такое обращение имело смысл, подпрограмма должна быть организована должным образом, т.е. реализовала бы именно рекурсивный алгоритм. Например, составим функцию, вычисляющую сумму элементов одномерного массива. Если использовать известный прием накопления суммы, предусматривающий вычисление суммы в цикле, то такая функция может иметь следующий вид:

  1. program fun2rec;

  2. {$APPTYPE CONSOLE}

  3. uses

  4. SysUtils;

  5. const nn=20;

  6. type mas=array[1..nn] of real;

  7. var a:mas;

  8. i,n:integer; s:real;

  9. function sum(a:mas;n:integer):real;

  10. var i:integer;

  11. begin

  12. result:=0;

  13. for i:=1 to n do

  14. Result:=Result+a[i];

  15. end;

  16. begin

  17. readln(n);

  18. for i:=1 to n do

  19. read(a[i]);

  20. readln;

  21. s:=sum(a,n);

  22. writeln('s= ',s:6:1);

  23. readln;

  24. end.

Рекурсивный вариант:

  1. function sum(a:mas;n:integer):real;

  2. begin

  3. if n=1 then sum:=a[n]

  4. else sum:=a[n]+sum(a,n-1)

  5. end;

  1. При создании косвенной рекурсии возникает проблема: как описать вызываемую процедуру. Как известно, в Паскале все переменные, константы, метки, процедуры должны быть описаны до того, как будут упомянуты в операторах или выражениях, в противном случае компилятор объявит их имена неизвестными. В косвенной рекурсии процедура "А" вызывает процедуру "В", которая не описана. Выход из ситуации в следующем: используется опережающее описание с помощью директивы FORWARD. Эта директива объявляет только заголовок вызываемой процедуры, заменяя собой тело процедуры, откладывая описание содержимого (раздела операторов) на дальнейшее. Местоположение раздела операторов уже не играет роли, и в нем можно не указывать формальные параметры, а ограничиться лишь именем подпрограммы:Procedure B(y:integer); FORWARD;

  2. {описание раздела операторов процедуры "В"}

  3. {откладывается на дальнейшее}

  4. Procedure A(x:integer);

  5. begin

  6. ....................

  7. B(x);

  8. ....................

  9. end;

  10. Procedure B; {формальные параметры описаны ранее}

  11. begin

  12. ....................

  13. A(y);

  14. ....................

  15. end;

  16. Теперь в процедуре "А" допустимо обращение к процедуре "В", ведь последняя уже описана, точнее известны ее формальные параметры и компилятор может правильно организовать ее вызов. Заголовок "Procedure B" перед текстом процедуры "В" содержит только имя процедуры, т.к. список формальных параметров был указан выше.

13 Задание начальных значений переменным. Примеры использования в программах для различных типов данных, определяемых пользователем.

В Delphiимеется возможность объявления переменных с заданным начальным значением. Такие переменные называютинициализированнымии объявляют в специальном конструкцииCONST.

Инициализированных переменных в программе можно изменять, так же как и обычные

Соседние файлы в папке экзамен