Задача 36 с сайта К.Ю.Полякова Дан рекурсивный алгоритм: procedure F(n: integer); begin...

0 голосов
65 просмотров

Задача 36 с сайта К.Ю.Полякова
Дан рекурсивный алгоритм:
procedure F(n: integer);
begin
writeln('*');
if n > 0 then begin
writeln('*');
F(n-2);
F(n div 2);
end
end;
Сколько символов "звездочка" будет напечатано на экране при выполнении вызова F(7)?

Как решать эту задачу методом дерева? И вообще, возможно ли это?


Информатика Начинающий (103 баллов)
Дан 1 ответ
0 голосов
Начинающий (812 баллов)
 
Правильный ответ

Да, пожалуй, это самый удобный и наглядный способ. Рисуем дерево вызовов. Понимаем, что если функция вызвалась с числом <=0, то печатается одна звезда, затем на этой ветке рекурсия останавливается. Если же функция вызвалась с параметром > 0, То печатается 2 звезды и возникают новые две ветки рекурсивных вызовов. Прилагаю рисунок, красными точками отмечены звезды, печатающиеся при конкретном вызове функции. Ответо будет являться общее количество таких точек. Важно понять, что при наличии идентичных веток можно посчитать результат для такой ветки один раз и использовать его для других таких же.

Ответ: 31.


image
...