1. Testul 1
1.Precizaţi valorile de adevăr ale afirmaţiilor de mai jos:
a) Orice subprogram recursiv trebuie sa aibă cel puţin un parametru transmis prin
valoare
b) Orice subprogram recursiv se poate implementa si nerecursiv
c) Un subprogram este recursiv daca si numai daca conţine mai mult de un apel
autoapel
d) Programul principal (Pascal) sau funcţia main (C++) nu pot conţine autoapel
R: f,a,f,a
2.La fiecare apel recursiv al unui subprogram, in segmentul de stiva sunt memorate
a) Adresa de revenire, valorile variabilelor locale si a parametrilor transmişi prin referinţă
b) Adresa de revenire si valorile variabilelor globale
c) Adresa de revenire, valorile variabilelor locale si a parametrilor transmişi prin valoare
si adrese parametrilor transmişi prin referinţa
d) Adresa de revenire, valorile locale si a variabilelor globale
R: c)
3.Fie funcţia recursivă
functiona ael ( n:integer ):integer; int ael ( int n )
begin {
if n=0 then ael:=0 if ( n = =0 ) return 0
else ael:=ael ( n-1 ) + 2*n-1; else return ( ael(n-1)+2*n-1)
end; }
Precizaţi valoarea lui n pentru care ael (n)= 36
a) 9
b) 3
c) 15
d) 6
R: d)
4. Se consideră subprogramul recursiv:
procedure test (n:integer); void test ( int n )
begin {
if n<>1 then if ( n!=1 )
begin {
write (n, ’,’); cout<<n<<”,”
if (n mod 2) then test (n div 2) if ( n%2 = =0 ) test (n/2)
else test (3*n+1); else test (3*n+1)
end }
else write (1); else cout<<1;
end;
Precizaţi ce va fi afişat la apelul test(10)?
2. a) 10,5,4,2,1
b) 10,5,16,8,4,2
c) 10,5,16,8,4,2,1
d) 5,16,8,4,2,1
R: c)
5. Fie funcţia recursiva:
function verif( n,k: integer): integer; int test (int n, int k)
begin {
if ( k=n ) then verif:=1 if (k= =n) return 1;
else if (n mod k=0) then verif:=0 else if ( n%k= =0 ) return 0;
else verif:=verif (n, k+1); else return test (n, k+1)
end; }
La apelul verif (n,2) valoarea funcţiei este 1 dacă şi numai dacă:
a) n Î À şi n este par
b) n Î À şi n este prim
c) n Î À şi n este impar
d) n Î À şi n nu este prim
R: b)
6. Fie şirul de numere definit astfel:
m, pentru n=0 şi mЄÂ
an
an= , dacă n este par
4
4 an-1, dacă n este impar
Care este valoarea termenului a5 , dacă m=2 ?
a) 5
b) 6
c) 12
d) 7
e) 2
R: a)
7. Fie următorul subprogram recursiv:
procedure c ( b,a: word); end;
begin end;
if ( a<= b div 2) then void c ( unsigned b, unsigned a)
begin {
if not (b mod a<>0) then write(a,’ ’); if (a <= b/2)
c (b,a+1); { if (!(b%a= = 0)) cout <<a<<” “
3. c (b, a+1) }
}
La apelul c (15,2), se va afişa:
a) 3515
b) 2467
c) 35
d) 135
R: c)
8. Se considera funcţia s: N* x N* → N definită astfel
La apelul funcţiei s (3,5) unde m=1 şi n=1 se va obţine
a) 12
b) 11
c) 8
d) 9
R: b)
Fie programul următor:
program T9; # include <iostream.h>
var x,z:integer; int x,y;
procedure t( x:integer, z:integer); void t (int x, int y)
begin { if (x>0)
if x>0 then begin { x=x-1;
x:=x-1; y=y-1;
y:=y-1; t (x,y);
t (x,y); }
end; }
begin void main()
x=3;y=1; { x=3; y=1;
write (x,’’,y,’’); cout<<x<<” ”<<y<<” ”;
t (x,y); t (x,y);
writeln (x,’ ’,y,’ ’); cout<<x<<” ”<<y<<” ”<<endl;
end. }
Care este modificarea din program, astfel încât după execuţia să se afişeze 3 1 0 1
PASCAL
a) procedure t (var x:integer; y: integer);
b) procedure t (var x:integer; var y: integer);
c) procedure t (x:integer; var y: integer);
C++
4. a) void t (int & x, int y);
b) void t (int & x, int & y);
c) void t (int x, int & y);
R: a)