Ниже записаны две рекурсивные процедуры, F и G: procedure F(n: integer); forward; procedure G(n: integer);...

Тематика Информатика
Уровень 10 - 11 классы
рекурсия процедуры программирование алгоритмы вычисления вызов функций паскаль звёздочки F(13) G(n)
0

Ниже записаны две рекурсивные процедуры, F и G: procedure F(n: integer); forward; procedure G(n: integer); forward; procedure F(n: integer); begin writeln(''); if n > 0 then G(n - 1); end; procedure G(n: integer); begin writeln(''); if n > 1 then F(n - 2); end; Сколько символов «звёздочка» будет напечатано на экране при выполнении вызова F(13)?

avatar
задан 5 дней назад

2 Ответа

0

Разберём задачу пошагово.

У нас есть две взаимно рекурсивные процедуры: F и G. Они работают следующим образом:

  1. Процедура F(n):

    • Печатает одну звёздочку (*).
    • Если n > 0, вызывает процедуру G(n - 1).
  2. Процедура G(n):

    • Также печатает одну звёздочку (*).
    • Если n > 1, вызывает процедуру F(n - 2).

Мы вызываем F(13). Необходимо определить, сколько звёздочек будет напечатано, то есть сколько раз выполняется оператор writeln('*').


Распишем выполнение вызовов

  1. Шаг 1: Начальный вызов F(13):

    • Печатает *. (1 звёздочка)
    • Вызывает G(12).
  2. Шаг 2: Вызов G(12):

    • Печатает *. (2 звёздочки)
    • Так как 12 > 1, вызывает F(10).
  3. Шаг 3: Вызов F(10):

    • Печатает *. (3 звёздочки)
    • Вызывает G(9).
  4. Шаг 4: Вызов G(9):

    • Печатает *. (4 звёздочки)
    • Так как 9 > 1, вызывает F(7).
  5. Шаг 5: Вызов F(7):

    • Печатает *. (5 звёздочек)
    • Вызывает G(6).
  6. Шаг 6: Вызов G(6):

    • Печатает *. (6 звёздочек)
    • Так как 6 > 1, вызывает F(4).
  7. Шаг 7: Вызов F(4):

    • Печатает *. (7 звёздочек)
    • Вызывает G(3).
  8. Шаг 8: Вызов G(3):

    • Печатает *. (8 звёздочек)
    • Так как 3 > 1, вызывает F(1).
  9. Шаг 9: Вызов F(1):

    • Печатает *. (9 звёздочек)
    • Вызывает G(0).
  10. Шаг 10: Вызов G(0):

    • Печатает *. (10 звёздочек)
    • Так как `0

avatar
ответил 5 дней назад
0

Чтобы понять, сколько звездочек будет напечатано при вызове процедуры F(13), давайте проанализируем обе рекурсивные процедуры F и G и их взаимодействие.

Процедура F

procedure F(n: integer);
begin
  writeln('*');
  if n > 0 then
    G(n - 1);
end;
  • При вызове F(n) сначала печатается одна звездочка.
  • Если n > 0, вызывается процедура G(n - 1).

Процедура G

procedure G(n: integer);
begin
  writeln('*');
  if n > 1 then
    F(n - 2);
end;
  • При вызове G(n) также печатается одна звездочка.
  • Если n > 1, вызывается процедура F(n - 2).

Анализ вызова F(13)

Теперь давайте проследим за вызовами и посчитаем, сколько звездочек будет напечатано.

  1. Вызов F(13):

    • Печатаем 1 звездочку.
    • Вызываем G(12).
  2. Вызов G(12):

    • Печатаем 1 звездочку.
    • Вызываем F(10).
  3. Вызов F(10):

    • Печатаем 1 звездочку.
    • Вызываем G(9).
  4. Вызов G(9):

    • Печатаем 1 звездочку.
    • Вызываем F(7).
  5. Вызов F(7):

    • Печатаем 1 звездочку.
    • Вызываем G(6).
  6. Вызов G(6):

    • Печатаем 1 звездочку.
    • Вызываем F(4).
  7. Вызов F(4):

    • Печатаем 1 звездочку.
    • Вызываем G(3).
  8. Вызов G(3):

    • Печатаем 1 звездочку.
    • Вызываем F(1).
  9. Вызов F(1):

    • Печатаем 1 звездочку.
    • Вызываем G(0).
  10. Вызов G(0):

    • Печатаем 1 звездочку.
    • Условие n > 1 не выполняется, поэтому завершение.

Теперь, подведем итоги:

  • Мы напечатали 1 звездочку на каждом из вызовов:
    • F(13) → 1 звезда
    • G(12) → 1 звезда
    • F(10) → 1 звезда
    • G(9) → 1 звезда
    • F(7) → 1 звезда
    • G(6) → 1 звезда
    • F(4) → 1 звезда
    • G(3) → 1 звезда
    • F(1) → 1 звезда
    • G(0) → 1 звезда

Общее количество звездочек

Суммируя все звездочки, мы получаем: 1 (F(13)) + 1 (G(12)) + 1 (F(10)) + 1 (G(9)) + 1 (F(7)) + 1 (G(6)) + 1 (F(4)) + 1 (G(3)) + 1 (F(1)) + 1 (G(0)) = 10 звездочек.

Таким образом, при выполнении вызова F(13) на экране будет напечатано 10 звездочек.

avatar
ответил 5 дней назад

Ваш ответ

Вопросы по теме