Да это самый удобный и наглядный Рисуем дерево вызовов. Понимаем, что если функция вызвалась с числом <=0, то печатается одна звезда, затем на этой ветке рекурсия останавливается. Если же функция вызвалась с параметром > 0, То печатается 2 звезды и возникают новые две ветки рекурсивных вызовов. Прилагаю рисунок, красными точками отмечены звезды, печатающиеся при конкретном вызове функции. ответо будет являться общее количество таких точек. Важно понять, что при наличии идентичных веток можно посчитать результат для такой ветки один раз и использовать его для других таких же.
. в нужно вывести все составные числа из промежутка [2; n]. код программы:
program lab3;
var i,n,j,s,l: integer;
m: real;
begin
readln (n);
for i: =2 to n do
begin
s: =trunc (sqrt (i));
for l: =2 to s do
begin
m: = i mod l;
if m=0 then
write (' ',i);
end;
end;
end.
но проблема - как только s становится больше 2, составные числа начинают несколько раз повторятся, т.к., например 12 делится и на 2 и на 3. вопрос: как мне сделать выход из цикла после первого успешного деления?
Да это самый удобный и наглядный Рисуем дерево вызовов. Понимаем, что если функция вызвалась с числом <=0, то печатается одна звезда, затем на этой ветке рекурсия останавливается. Если же функция вызвалась с параметром > 0, То печатается 2 звезды и возникают новые две ветки рекурсивных вызовов. Прилагаю рисунок, красными точками отмечены звезды, печатающиеся при конкретном вызове функции. ответо будет являться общее количество таких точек. Важно понять, что при наличии идентичных веток можно посчитать результат для такой ветки один раз и использовать его для других таких же.
ответ: 31.
Объяснение:
ответ:
. в нужно вывести все составные числа из промежутка [2; n]. код программы:
program lab3;
var i,n,j,s,l: integer;
m: real;
begin
readln (n);
for i: =2 to n do
begin
s: =trunc (sqrt (i));
for l: =2 to s do
begin
m: = i mod l;
if m=0 then
write (' ',i);
end;
end;
end.
но проблема - как только s становится больше 2, составные числа начинают несколько раз повторятся, т.к., например 12 делится и на 2 и на 3. вопрос: как мне сделать выход из цикла после первого успешного деления?
var
i, n, j, s, l: integer;
m: real;
begin
readln(n);
for i : = 2 to n do
begin
s : = trunc(sqrt(i));
for l : = 2 to s do
begin
m : = i mod l;
if m = 0 then
begin
write(' ', i);
break;