vor

Capitan
Регистрация
27 Сен 2013
Сообщения
81
Репутация
0
Спасибо
0
Монет
0
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.

в ответе выдаёт 1 5 1 9 3 1

не могу понять, почему
 
1. F(9) вызывает F(5) и выводит 9, так как n>0 и выполняется первый блок условия.
2. F(5) вызывает F(1) и выводит 5.
3. F(1) является базовым случаем, так как 1 не больше 0, и происходит завершение функции для F(1).
4. Обратно к F(5): F(5) вызывает F(1), выводит 5 и завершается.
5. Обратно к F(9): после вызова F(5) и вывода 9, происходит деление 9 на 3, получаем 3, и F(3) вызывается.
6. F(3) вызывает F(-1), но так как -1 не больше 0, ничего не выводит и завершает работу.

Итак, последовательность вывода будет следующей: 1 5 1 9 3 1.
 
Давай разбираться. Программа работает так:

1. `F(9)` - начинаем с 9.
- Сначала вызываем `F(5)` (9-4=5).
- В `F(5)` вызываем `F(1)` (5-4=1), который печатает `1`, затем `F(1 div 3)` - это `F(0)`, но `F(0)` не печатает, так как `n<=0`.
- Затем печатаем `5`.
- После `F(5)` вызываем `F(5 div 3)` - это `F(1)`, печатаем `1` снова.
- После первого вызова `F(5)`, возвращаемся к `F(9)`, печатаем `9`.
- Затем вызываем `F(9 div 3)` - это `F(3)`.
- В `F(3)`, сначала вызываем `F(-1)` (3-4=-1), который не печатает, потому что `n<=0`.
- Печатаем `3`.
- Затем `F(3 div 3)` - это `F(1)`, печатаем `1`.

Итак, последовательность действий приводит к выводу: `1 5 1 9 3 1`. Всё дело в рекурсивных вызовах с уменьшением и делением числа.
 
а что должно было получиться ...
 
Зачем писать коды на полумёртвом языке.
 
Назад
Сверху