Задание 5. Тип заданий 11: рекурсивные алгоритмы.
  • Задание:

    Ниже записаны две рекурсивные функции (процедуры): F и G.

    Pascal:
    procedure F(n: integer); forward;
    procedure G(n: integer); forward;

    procedure F(n: integer);
    begin
      if n > 0 then
        G(n — 1);
    end;

    procedure G(n: integer);
    begin
      writeln('*');
      if n > 1 then
        begin
          F(n — 2);
          writeln('**');
        end;
    end;

    Сколько символов "звёздочка" будет выведено на экран при вызове процедуры F(15)?

  • Решение:

    Нам дан алгоритм со взаимной рекурсией двух процедур F и G. Проще говоря, процедура F вызывает процедуру G, которая, в свою очередь, вызывает процедуру F.

    Процедура F вызывает процедуру G в том случае, если n>0, а процедура G вызывает процедуру F при n>1.

    Нам нужно определить количество звёздочек, которое будет выведено на экран. Обратите внимание, звёздочки выводит только процедура G (writeln('*') и writeln('**')). При этом одна звёздочка выводится в любом случае при вызове G, а две звёздочки — если n > 1.

    Процедура F(n) вызывает процедуру G(n-1), а процедура G(n) — процедуру F(n-2). Рассмотрим, какие процедуры будут вызваны при вызове F(15):

    F(15) -> G(14) ->F(12) ->G(11) -> F(9) -> G(8) -> F(6) -> G(5) -> F(3) -> G(2) -> F(0)

    Нас интересуют процедуры G, так как именно они выводят звёздочки:

    F(15) -> G(14) ->F(12) ->G(11) -> F(9) -> G(8) -> F(6) -> G(5) -> F(3) -> G(2) -> F(0)

    Всего процедура G была вызвана пять раз. При этом во всех случаях условие n>1 выполняется, то есть на экран выводится три звёздочки (одна до условия, две в условии).

    Таким образом. общее количество звёздочек равно 5*3=15

    Ответ: 15

Поделиться:
 
Комментарии (0)

Нет комментариев. Ваш будет первым!

Перевести число из в Результат: 510 = 1012