Дана программа:
program rek;
procedure F(n: integer);
begin
if n > 0 then
begin
F(n - 4);
writeln(n);
F(n div 3)
end;
end;
begin
F(9)
end.
Не выполняя программу на компьютере, выясните, что получится в результате работы этой программы. Проверьте свой результат, выполнив программу на компьютере.
По правилу выполнения процедуры сначала проверяется F(n - , затем writeln(n), потом F(n div . Поэтому число печатается после полного завершения первого рекурсивного вызова, но до второго.
Проследим вызовы слева направо; «—» означает, что число не печатается:
| Вызов | Первый вызов F(n- |
Вывод n |
Последний вызов F(n div |
|---|---|---|---|
F( |
F( |
F( |
|
F( |
F( |
F( |
|
каждый F( |
F(- |
F( |
|
F( |
F(- |
F( |
|
F(-, F(-, F( |
— | — | — |
Развернём порядок исполнения. Первый F( внутри F( выводит F( выводит F( внутри него выводит F( исходный вызов выводит F(: его первый вызов F(- ничего не печатает, поэтому выходит F( выводит
Программа выводит по отдельным строкам:
