Дан рекурсивный алгоритм: procedure f(n: integer); begin writeln('*'); if n > 0 then begin f(n-3); f(n-2); f(n div 2); f(n div 2); end end; сколько символов "звездочка" будет напечатано на экране при выполнении вызова f(6)?
Дурацкая по своей трудоемкости задача, если делать её вручную. А если написать полную программу и вставить туда счетчик вызовов F(n), то окажется, что для вызова F(6) процедура будет вызвана 97 раз. При каждом вызове выводится звездочка, поэтому их будет выведено тоже 97.
Проверка выполнялась по следующей программе: var k:integer;
procedure F(n: integer); begin writeln('*'); k:=k+1; if n > 0 then begin F(n - 3); F(n - 2); F(n div 2); F(n div 2); end end;
// PascalABC.NET 3.0, сборка 1111 var a,b:BigInteger; sa,sb:string; begin Write('Первое слагаемое: '); Readln(sa); if BigInteger.TryParse(sa,a)=False then Writeln('Это не целое число!') else begin Write('Второе слагаемое: '); Readln(sb); if BigInteger.TryParse(sb,b)=False then Writeln('Это не целое число!') else Writeln('Точный результат: ',a+b) end end.
Тестовое решение: Первое слагаемое: 5423323409523846095938445870434764308454095 Второе слагаемое: 7425543205430235436743455446541423534233 Точный результат: 5430748952729276331375189325881305731988328
Var s,s1:string; a,b:array[1..100]of integer; i,n,x,k:integer; begin readln(s); readln(s1); n:=1; if length(s)>length(s1) then x:=length(s) else x:=length(s1); for i:=1 to length(s) do begin val(copy(s,i,1),k,n); a[i+x-length(s)]:=k; end; for i:=1 to length(s1) do begin val(copy(s1,i,1),k,n); b[i+x-length(s1)]:=k; end; for i:=1 to length(s) do a[i]:=a[i]+b[i]; for i:=length(s) downto 2 do begin a[i-1]:=a[i-1]+a[i]div 10; a[i]:=a[i]mod 10; end; for i:=1 to length(s) do write(a[i]);
А если написать полную программу и вставить туда счетчик вызовов F(n), то окажется, что для вызова F(6) процедура будет вызвана 97 раз. При каждом вызове выводится звездочка, поэтому их будет выведено тоже 97.
Проверка выполнялась по следующей программе:
var
k:integer;
procedure F(n: integer);
begin
writeln('*');
k:=k+1;
if n > 0 then begin
F(n - 3);
F(n - 2);
F(n div 2);
F(n div 2);
end
end;
begin
k:=0;
F(6);
Writeln(k)
end.