Персональная страничка
Диканева Тараса
Викторовича

Главная \ Преподавательское \ Программирование для начинающих

11. Процедуры и функции

Предыдущий раздел:

Следующий раздел:

11.9. Опережающее описание

В теле каждой процедуры или функции может содержаться вызов других процедур или функций при условии, что они описаны раньше, чем процедура или функция их вызывающая. Однако есть возможность вызывать и те процедуры, которые описаны после вызывающей. Для этого надо скопировать заголовок вызываемой подпрограммы и разместить его выше всех описаний. Например:

  {Опережающее описание функции F1 - заголовок без тела функции}
  function F1(x: real): real; 

  procedure P6;
  var
    x: real;
  begin
    ... {Какие-то действия}
    {Вызов функции F1 возможен благодаря опережающему описанию}
    x:=F1(x);
    ... {Какие-то действия}
  end;

  {Описание функции F1, теперь тело функции присутствует}
  function F1(x: real): real;
  begin
    ... {Какие-то действия}
    F1 := ... {Что-то}
  end;

Это может понадобиться, когда есть две процедуры, вызывающие другу друга, например:

  procedure A(n: integer);  {Опережающее описание первой процедуры}
  procedure B(n: integer);  {Опережающее описание второй процедуры}

  procedure A(n: integer);  {Полное описание процедуры A}
  begin
    writeln(n);
    B(n-1);
  end;

  procedure B(n: integer);  {Полное описание процедуры B}
  begin
    writeln(n);
    if n<10 then
      A(n+2);
  end;

Процедура A вызывает процедуру B, та в свою очередь вызывает A, а та снова B и т.д. Данная цепочка вызовов закончится, поскольку B вызывается каждый раз с на единицу большим значением параметра n. Когда n перестанет быть меньше 10, процедура B завершится, не вызвав A, что позволит завершиться и прочим процедурам в цепочке.

Следующий раздел:

Предыдущий раздел:

6 комментариев

  1. Илья

    По сути здесь приведён пример сложной рекурсии, но рекурсия как таковая не объясняется. Пример будет, скорее всего, совершенно непонятен.

  2. Д

    Не гони. Рекурсия — это не просто вызов самого себя в цепочке вызовов. Это осмысленное применение, чаще всего сокращающий код и ресурсозатраты. Здесь же просто ОБЪЯСНЯЕТСЯ что такое «Опережающее описание», как его объявлять, без ненужного указания зачем в А вызываем Б. Что тут СОВЕРШЕННО, как ты написал, не понятного??? Не отсталый в развитии человек найдет применение этому, хоть в рекурсии, хоть где, ему решать.

  3. Д

    И это не сложная рекурсия, а косвенная…

  4. Taras

    Если верить Википедии, то сложная и косвенная рекурсия это одно и то же.

  5. Д

    Искать информацию о правильности применения слова «сложная» к рекурсии смысла не вижу, да и лень, овчинка не стоит выделки. Но из того, что нашел — в английской же версии википедии ни о какой «сложности» рекусии речи не ведется, лишь о ее косвенности (indirect): http://en.wikipedia.org/wiki/Recursion_%28computer_science%29#Direct_and_indirect_recursion . А в нашей википедии понапишут конечно своих слов. Фраза понятна, но слух режет.

  6. Аноним

    forward забыли, нет?

Добавить комментарий