Главная / Программирование /
Программирование на языке 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) 0 
 (2) 1 
 (3) 5 
 (4) 9 
 (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) 0 
 (2) 1 
 (3) 4 
 (4) 7 
 (5) 9 
Номер 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) 0 
 (2) 1 
 (3) 4 
 (4) 7 
 (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;