Чтобы понять, сколько звездочек будет напечатано при вызове процедуры 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)
Теперь давайте проследим за вызовами и посчитаем, сколько звездочек будет напечатано.
Вызов F(13)
:
- Печатаем 1 звездочку.
- Вызываем
G(12)
.
Вызов G(12)
:
- Печатаем 1 звездочку.
- Вызываем
F(10)
.
Вызов F(10)
:
- Печатаем 1 звездочку.
- Вызываем
G(9)
.
Вызов G(9)
:
- Печатаем 1 звездочку.
- Вызываем
F(7)
.
Вызов F(7)
:
- Печатаем 1 звездочку.
- Вызываем
G(6)
.
Вызов G(6)
:
- Печатаем 1 звездочку.
- Вызываем
F(4)
.
Вызов F(4)
:
- Печатаем 1 звездочку.
- Вызываем
G(3)
.
Вызов G(3)
:
- Печатаем 1 звездочку.
- Вызываем
F(1)
.
Вызов F(1)
:
- Печатаем 1 звездочку.
- Вызываем
G(0)
.
Вызов 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 звездочек.