Соотнеси блок-схему с синтаксисом условного оператора Да Условие истино? if условие: Инструкция 1 Инструкция 1 инструкция 2 Нет Да Условие истино? if условие: Инструкция 1 else: Инструкция 2 Инструкция 1 инструкция 2 Назад Bne
const n=10; var i,k,min,max:integer; x,y:array[1..n]of integer; z:array[1..2*n]of integer;
function four(n:integer):string; var s:string; begin repeat s:=s+IntToStr(n mod 4); n:=n div 4; until n=0; result:=ReverseString(s); end;
begin for i:=1 to n do begin x[i]:=random(-10,10); y[i]:=random(-10,10); if (x[i] mod 2=0) and (x[i]>0) then begin k:=k+1; z[k]:=x[i]; if k=1 then begin min:=z[1]; max:=z[1]; end; if z[k]>max then max:=z[k]; if z[k]<min then min:=z[k]; end; if (y[i] mod 2=0) and (y[i]>0) then begin k:=k+1; z[k]:=y[i]; if k=1 then begin min:=z[1]; max:=z[1]; end; if z[k]>max then max:=z[k]; if z[k]<min then min:=z[k]; end; end; write('Массив X:'); for i:=1 to n do write(x[i]:4); writeln; write('Массив Y:'); for i:=1 to n do write(y[i]:4); writeln; write('Массив Z:'); for i:=1 to k do write(z[i]:4); writeln; write('Измененный массив Z:'); for i:=1 to k do begin if z[i]=min then z[i]:=max else if z[i]=max then z[i]:=min; write(z[i]:4); end; writeln; write('Массив Z по основанию 4:'); for i:=1 to k do write(four(z[i]):4); end.
Вся сложность рекурсивных алгоритмов заключается в том, что внутри одной функции запустится другая.
Запускается F(5)
n>0? 5>0? - Да.
Выводится звёздочка, Запускается F(3), потом F(4), потом F(4) и снова выводится звёздочка (если все эти команды под условие попадают, а то у вас табуляция не расставлена)
На данный момент мы имеем 2 звёздочки и ещё 3 функции, которые должны быть выполнены.
Начнём с F(3)
3>0? Да. Тогда:
Выводится звёздочка, Запускается F(1), потом F(2), потом F(2) и снова выводится звёздочка
Уже 4 звёздочки
Нам осталось 2 раза выполнить F(2) (результаты у них будут одинаковые)
2 раза F(4) и F(1)
Запустим F(1):
1>0? Да.
Выводится звёздочка, Запускается F(-1), потом F(0), потом F(0) и снова выводится звёздочка
Звёздочек 6.
F(-1): -1>0? Нет. Ничего не делаем
F(0): 0>0? Нет. Ничего не делаем
F(2):
2>0
Выводится звёздочка, Запускается F(0), потом F(1), потом F(1) и снова выводится звёздочка
Уже 8 звёздочек
И 2 раза выводим F(1), а каждое F(1) даёт нам по 2 звёздочки
Итог: 12 звёздочек.
F(2) надо выполнить 2 раза, то бишь ещё 6 звёздочек, итог 18
Осталось 2 раза выполнить F(4)
4>0
Выводится звёздочка, Запускается F(2), потом F(3), потом F(3) и снова выводится звёздочка
20 звёздочек + 6 от F(2) + 16 от F(3) + 16 от F(3) = 58 звёздочек
F(4) выполняем второй раз 58+40=98 звёздочек - ответ
В дополнение прикреплю визуальное решение, оно должно быть попроще:
var
i,k,min,max:integer;
x,y:array[1..n]of integer;
z:array[1..2*n]of integer;
function four(n:integer):string;
var s:string;
begin
repeat
s:=s+IntToStr(n mod 4);
n:=n div 4;
until n=0;
result:=ReverseString(s);
end;
begin
for i:=1 to n do
begin
x[i]:=random(-10,10);
y[i]:=random(-10,10);
if (x[i] mod 2=0) and (x[i]>0) then
begin
k:=k+1;
z[k]:=x[i];
if k=1 then
begin
min:=z[1];
max:=z[1];
end;
if z[k]>max then max:=z[k];
if z[k]<min then min:=z[k];
end;
if (y[i] mod 2=0) and (y[i]>0) then
begin
k:=k+1;
z[k]:=y[i];
if k=1 then
begin
min:=z[1];
max:=z[1];
end;
if z[k]>max then max:=z[k];
if z[k]<min then min:=z[k];
end;
end;
write('Массив X:');
for i:=1 to n do write(x[i]:4);
writeln;
write('Массив Y:');
for i:=1 to n do write(y[i]:4);
writeln;
write('Массив Z:');
for i:=1 to k do write(z[i]:4);
writeln;
write('Измененный массив Z:');
for i:=1 to k do
begin
if z[i]=min then z[i]:=max
else
if z[i]=max then z[i]:=min;
write(z[i]:4);
end;
writeln;
write('Массив Z по основанию 4:');
for i:=1 to k do write(four(z[i]):4);
end.
Вся сложность рекурсивных алгоритмов заключается в том, что внутри одной функции запустится другая.
Запускается F(5)
n>0? 5>0? - Да.
Выводится звёздочка, Запускается F(3), потом F(4), потом F(4) и снова выводится звёздочка (если все эти команды под условие попадают, а то у вас табуляция не расставлена)
На данный момент мы имеем 2 звёздочки и ещё 3 функции, которые должны быть выполнены.
Начнём с F(3)
3>0? Да. Тогда:
Выводится звёздочка, Запускается F(1), потом F(2), потом F(2) и снова выводится звёздочка
Уже 4 звёздочки
Нам осталось 2 раза выполнить F(2) (результаты у них будут одинаковые)
2 раза F(4) и F(1)
Запустим F(1):
1>0? Да.
Выводится звёздочка, Запускается F(-1), потом F(0), потом F(0) и снова выводится звёздочка
Звёздочек 6.
F(-1): -1>0? Нет. Ничего не делаем
F(0): 0>0? Нет. Ничего не делаем
F(2):
2>0
Выводится звёздочка, Запускается F(0), потом F(1), потом F(1) и снова выводится звёздочка
Уже 8 звёздочек
И 2 раза выводим F(1), а каждое F(1) даёт нам по 2 звёздочки
Итог: 12 звёздочек.
F(2) надо выполнить 2 раза, то бишь ещё 6 звёздочек, итог 18
Осталось 2 раза выполнить F(4)
4>0
Выводится звёздочка, Запускается F(2), потом F(3), потом F(3) и снова выводится звёздочка
20 звёздочек + 6 от F(2) + 16 от F(3) + 16 от F(3) = 58 звёздочек
F(4) выполняем второй раз 58+40=98 звёздочек - ответ
В дополнение прикреплю визуальное решение, оно должно быть попроще: