игра брюс 2048
Главная / Программирование / Программирование на языке Pascal / Тест 9

Программирование на языке Pascal - тест 9

Упражнение 1:
Номер 1
Динамическая структура данных, у которой в каждый момент времени доступны первый и последний элементы, причем добавлять новые элементы можно только в конец структуры, а удалять - только из ее начала, называется:

Ответ:

 (1) стеком 

 (2) очередью 

 (3) деком 


Номер 2
Динамическая структура данных, у которой в каждый момент времени доступны первый и последний элементы, причем и добавлять, и удалять элементы можно как на конце структуры, так и в ее начале, называется:

Ответ:

 (1) стеком 

 (2) очередью 

 (3) деком 


Номер 3
Динамическая структура данных, у которой в каждый момент времени доступен только последний элемент, причем добавлять и удалять элементы можно только на конце структуры, называется:

Ответ:

 (1) стеком 

 (2) очередью 

 (3) деком 


Упражнение 2:
Номер 1
Описанные ниже подпрограммы
        function C: boolean; forward;
function D: boolean; forward;

procedure A;
 begin
  x:= c(x);
  y:= d(y);
 end;

function B: boolean;
 begin
  a;
 end;

function C;
 begin
  z:= b(z);
 end;

function D;
 begin
  z:= b(z);
 end;

Ответ:

 (1) реализуют прямую рекурсию 

 (2) реализуют косвенную рекурсию 

 (3) не рекурсивны 


Номер 2
Описанные ниже подпрограммы
        function C: boolean; forward;
function D: boolean; forward;

procedure A;
 begin
  x:= c(x);
  y:= d(y);
 end;

function B: boolean;
 begin
  z:= d(z);
 end;

function C;
 begin
  z:= b(z);
 end;

function D;
 begin
  z:= b(z);
 end;

Ответ:

 (1) реализуют прямую рекурсию 

 (2) реализуют косвенную рекурсию 

 (3) не рекурсивны 


Номер 3
Описанные ниже подпрограммы
        function C: boolean; forward;
function D: boolean; forward;

procedure A;
 begin
  x:= c(x);
  y:= d(y);
 end;

function B: boolean;
 begin
  x:= c(x);
 end;

function C;
 begin
  z:= c(z);
 end;

function D;
 begin
  z:= d(z);
 end;

Ответ:

 (1) реализуют прямую рекурсию 

 (2) реализуют косвенную рекурсию 

 (3) не рекурсивны 


Упражнение 3:
Номер 1
Имеется набор натуральных чисел, быть может, с повторениями. Необходимо разделить его на два поднабора так, чтобы разность сумм весов была минимальной. Эта задача решается рекурсивным методом полного перебора с отсечением (см. ниже). На вход были поданы числа 18  32  5  5  6  2  78  4  56  5  2. При какой глубине стека контекстов произойдет завершение работы программы (обращение к завершающей процедуре out())?
        {массив а хранит веса всех предметов, в порядке их ввода,
 half - "большая" половина суммы всех весов,
 dif - отклонение текущей найденной суммы от half}
procedure rec(k: byte; sum: longint; var dif: longint);
var i: byte;
begin if sum+a[k]<=half
        then for i:= k+1 to n do rec(i,sum+a[k],dif)
        else if half-sum<dif 
              then begin 
                    dif:= half-sum;
                    if dif<2 then out(dif){печать и завершение}
                   end
end;

Ответ:

 (1)

 (2)

 (3)

 (4)

 (5) 11 


Номер 2
Имеется набор натуральных чисел, быть может, с повторениями. Необходимо разделить его на два поднабора так, чтобы разность сумм весов была минимальной. Эта задача решается рекурсивным методом полного перебора с отсечением (см. ниже). На вход были поданы числа 36 72 45 2 38 96 15 2 2. При какой глубине стека контекстов произойдет завершение работы программы (обращение к завершающей процедуре out())?
        {массив а хранит веса всех предметов, в порядке их ввода,
 half - "большая" половина суммы всех весов,
 dif - отклонение текущей найденной суммы от half}
procedure rec(k: byte; sum: longint; var dif: longint);
var i: byte;
begin if sum+a[k]<=half
        then for i:= k+1 to n do rec(i,sum+a[k],dif)
        else if half-sum<dif 
              then begin 
                    dif:= half-sum;
                    if dif<2 then out(dif){печать и завершение}
                   end
end;

Ответ:

 (1)

 (2)

 (3)

 (4)

 (5)


Номер 3
Имеется набор натуральных чисел, быть может, с повторениями. Необходимо разделить его на два поднабора так, чтобы разность сумм весов была минимальной. Эта задача решается рекурсивным методом полного перебора с отсечением (см. ниже). На вход были поданы числа 45 48 32 12 12 15 46 2 2 3 15. При какой глубине стека контекстов произойдет завершение работы программы (обращение к завершающей процедуре out())?
        {массив а хранит веса всех предметов, в порядке их ввода,
 half - "большая" половина суммы всех весов,
 dif - отклонение текущей найденной суммы от half}
procedure rec(k: byte; sum: longint; var dif: longint);
var i: byte;
begin if sum+a[k]<=half
        then for i:= k+1 to n do rec(i,sum+a[k],dif)
        else if half-sum<dif 
              then begin 
                    dif:= half-sum;
                    if dif<2 then out(dif){печать и завершение}
                   end
end;

Ответ:

 (1)

 (2)

 (3)

 (4)

 (5) 11 


Упражнение 4:
Номер 1
Какие из приведенных ниже подпрограмм вычисляют функцию двойного факториала (n!!), определяемую следующим образом:
        0!! =1
1!! = 1
n!! = n*(n-2)!!, для любого натурального n.

Ответ:

 (1) function f(n,k:longint):longint; var ff: longint; begin if (k=0)or(k=n) then f:= 1 else if k>n then f:= 0 else begin ff:= f(n-1,k-1)+f(n-1,k); f:= ff end; end; 

 (2) function f(c:longint):longint; var a: array[1..1000]of longint; i: integer; begin a[1]:= 1; a[2]:= 1; for i:= 3 to c do a[i]:= a[i-1]+a[i-2]; f:= a[c] end;  

 (3) function f(c:longint):longint; begin if (c=0)or(c=1) then f:= 1 else f:= f(c-2)*c end; 

 (4) function f(c:longint):longint; begin if c =1 then f:= 1 else f:= f(c-1)+f(c-2) end;  

 (5) function f(n,k:longint):longint; var a: array[0..n]of longint; i,j,t,tt: longint; begin if k>n then f:= 0 else if (k=n)or(k=0) then f:= 1 else begin a[0]:= 1; a[1]:= 1; for i:= 2 to k do a[i]:= 0; for i:= 2 to n do begin t:= 1; for j:= 1 to i-1 do begin tt:= a[j]+t; t:= a[j]; a[j]:= tt; end; a[i]:= 1; end end; f:= a[k] end; 

 (6) function f(c:longint):longint; var ff: longint; begin ff:= 1; while c >1 do begin ff:= ff*c; dec(c,2); end; f:= ff end; 


Номер 2
Какие из приведенных ниже подпрограмм вычисляют биномиальный коэффициент nk = n!/k!(n-k)!) определяемый следующим образом:
        Сnk = 0, если k > n;
Сnk = 1, если k = 0 или k = n;
Сnk = Сn-1k + Сn-1k-1 в остальных случаях.

Ответ:

 (1) function f(n,k:longint):longint; var ff: longint; begin if (k=0)or(k=n) then f:= 1 else if k>n then f:= 0 else begin ff:= f(n-1,k-1)+f(n-1,k); f:= ff end; end; 

 (2) function f(c:longint):longint; var a: array[1..1000]of longint; i: integer; begin a[1]:= 1; a[2]:= 1; for i:= 3 to c do a[i]:= a[i-1]+a[i-2]; f:= a[c] end; 

 (3) function f(c:longint):longint; begin if c =1 then f:= 1 else f:= f(c-1)+f(c-2) end; 

 (4) f(n,k:longint):longint; var a: array[0..nnn]of longint; i,j,t,tt: longint; begin if k>n then f:= 0 else if (k=n)or(k=0) then f:= 1 else begin a[0]:= 1; a[1]:= 1; for i:= 2 to k do a[i]:= 0; for i:= 2 to n do begin t:= 1; for j:= 1 to i-1 do begin tt:= a[j]+t; t:= a[j]; a[j]:= tt; end; a[i]:= 1; end end; f:= a[k] end; 


Номер 3
Какие из приведенных ниже подпрограмм вычисляют k-e число Фибоначчи, определяемое следующим образом:
fib1 = 1;
fib2 = 1;
fibn = fibn-1+ fibn-2, для всех n>2.

Ответ:

 (1) function f(n,k:longint):longint; var ff: longint; begin if (k=0)or(k=n) then f:= 1 else if k>n then f:= 0 else begin ff:= f(n-1,k-1)+f(n-1,k); f:= ff end; end; 

 (2) function f(c:longint):longint; var a: array[1..1000]of longint; i: integer; begin a[1]:= 1; a[2]:= 1; for i:= 3 to c do a[i]:= a[i-1]+a[i-2]; f:= a[c] end; 

 (3) function f(c:longint):longint; begin if c =1 then f:= 1 else f:= f(c-1)+f(c-2) end; 

 (4) function f(n,k:longint):longint; var a: array[0..nnn]of longint; i,j,t,tt: longint; begin if k>n then f:= 0 else if (k=n)or(k=0) then f:= 1 else begin a[0]:= 1; a[1]:= 1; for i:= 2 to k do a[i]:= 0; for i:= 2 to n do begin t:= 1; for j:= 1 to i-1 do begin tt:= a[j]+t; t:= a[j]; a[j]:= tt; end; a[i]:= 1; end end; f:= a[k] end; 




Главная / Программирование / Программирование на языке Pascal / Тест 9