Pagina informaticii

Teste de informatică pentru liceu, articole C#, C/C++, PHP

Test recursivitate

Rândul 1

Toate subiectele sunt obligatorii. Se acordă 10 puncte din oficiu

Subiectul I (30 puncte) 
Alegeţi variantele corecte din variantele de răspuns date:

1. Ce va afişa următorul program:
#include<iostream.h>
void P(int n)
{ if (n)
    { cout<<n%5 ; P(n/5) ; cout<<n%5 ; }
            else cout<<’  ’
}
int main()
{ int n = 1234 ;
P(n) ; cout<<n ;
return 0 ; }

a) 1234    43211234                b) 41441   144141234             c) 14414   414410      
d) 41441   144140                   e) 14414   414410                   f) 14414   414411234

2. Se consideră următoarea funcţie recursivă:
int F(int x)
{ if (x == 0) return 0 ;
    else if (x%3 == 0) return F(x/10) + 1 ;
            else return F(x/10) ;
}
Care din următoarele instrucţiuni afişează valoarea 4 :
a) cout<<F(13369)        b) cout<<F(21369)       c) cout<<F(4)           d) cout<<F(2442) ;

3. Se consideră următoarea funcţie recursivă. Ce se afişează la ecran la apelul Scrie(21) ?
void Scrie(int x)
{ if (x > 1) scrie(x/2) ;
   cout<<x%2 ;
}
a) 10101          b) 11111          c) 01010          d) 00000

Subiectul II (20 puncte)
Fie funcţia:

int Numar(int n, int k)
{
   if (n<10) return n + k ;
            else return Numar(n/10 , 10*(k + n%10)) ;
}

Faceţi corespondenţa între apelul funcţiei şi valoarea obţinută:

Apelul funcţiei

Valoare rezultată

1. Numar(100, 0)

a) 1

2. Numar(123, 0)

b) 101

3. Numar(321, 0)

c) 123

4. Numar(100, 1)

d) 421

5. Numar(123, 1)

e) 321

Subiectul III (40 puncte)

III. 1. (20 puncte) Scrieţi o funcţie recursivă care returnează suma elementelor pare dintr-un vector de numere naturale.

III. 2. (20 puncte) Se consideră două şiruri de caractere s1, s2. Scrieţi o funcţie recursivă care returnează -1 dacă s1 este strict mai mic decât s2, returnează 0 dacă şirurile sunt egale şi returnează 1 dacă s1 este mai mare decât s2.

 

 Rândul 2

Toate subiectele sunt obligatorii. Se acordă 10 puncte din oficiu

Subiectul I (30 puncte) 
Alegeţi variantele corecte din variantele de răspuns date:

1. Ce va afişa pe ecran următorul program:
#include<iostream.h>
char x[11] = “abbbabaaab” ;

int Test(int i)
{ if (x[i] == 0) return 0 ;
   return  (x[i] == x[i+1]) + Test(i+1) ; }
int main()
{ cout<<Test(0) ;
   return 0 ; }

a) 0      b) nimic, se obţine eroare la compilare   c) 5      c) 3        d) 10             e) 4

2. Câte asteriscuri va afişa funcţia de mai jos la apelul sk(6) ?

void sk(int x)
{ int i ;
   for (i = 1 ; i <= x/2 ; i++)  sk(i) ;
   cout<<” * ” ;
}
a) un număr impar de asteriscuri                        b) 2                  c) 4                  d) 6

3. Fie funcţia:
int F(int n, int x)
{
  if (n < 2) return 1 ;
            else if (n % x == 0) return F(n/x , x+1) ;
                        else return 0 ;
}
Pentru care din următoarele apeluri funcţia F va returna valoarea 1 :

a) F(25,2)        b) F(36,2)        c) F(24,2)        d) F(5040, 2)

Subiectul II (20 puncte)
Fie funcţia:

void Numar(int n, int b)
{
   if (n > 0)
    {
            Numar(n/b) ;
            cout<<n%b ;
    }
}

Faceţi corespondenţa între apelul funcţiei şi valoarea obţinută:

Apelul funcţiei

Valoare rezultată

1. Numar(32, 2)

a) 100000

2. Numar(31, 2)

b) 3000

3. Numar(21, 3)

c) 210

4. Numar(81, 3)

d) 300

5. Numar(27, 3)

e) 11111

Subiectul III (40 puncte)

III. 1. (20 puncte) Scrieţi o funcţie recursivă care returnează suma cifrelor unui număr natural.

III. 2. (20 puncte) Se consideră două şiruri de caractere s1, s2. Scrieţi o funcţie recursivă care returnează 1 dacă şirurile sunt anagrame sau returnează 0 dacă şirurile nu sunt anagrame.

 

Barem de corectare

Rândul 1

Subiectul I
1. c
2. b , d
3. a
Subiectul II
1. a
2. e
3. c
4. b
5. d

Subiectul III

III. 1.
int Suma(int n)
{
 if (n == 0) return 0 ;
   else return n % 10 + Suma(n/10) ;
}

III. 2.
int Lex(char *s1, char *s2)
{
 if ((*s1 == NULL) && (*s2 == NULL)) return 0 ;
 if (*s1 == NULL) return -1 ;
 if (*s2 == NULL) return 1 ;
 if (*s1 < *s2) return -1 ;
   else if (*s1 > *s2) return 1 ;
      else return Lex(s1+1, s2+1) ;
}

Rândul 2

Subiectul I
1. f
2. d
3. c , d

Subiectul II
1. a
2. e
3. c
4. b
5. d

Subiectul III

III. 1.
int SumaPare(int *a, int i)
{
 if (i == n) return 0 ;
   else return (a[i]%2 == 0)*a[i] + SumaPare(a,i+1) ;
}

III. 2.
int Anagrame(char *s1, char *s2)
{
 if ((*s1 == NULL) && (*s2 == NULL)) return 1 ;
 if ((*s1 == NULL) || (*s2 == NULL)) return 0 ;
 char *p = strchr(s2, s1[0]) ;
 if (p == NULL) return 0 ;
  else
   {
    strcpy(p,p+1) ;
    return Anagrame(s1+1, s2) ;
   }
}

Despre autor
Author

Dan Pracsiu deţinător www.dponline.ro
Profesor, Liceul Teoretic "Emil Racoviță" Vaslui
Membru în Comisia Naţională a Olimpiadelor de Informatică
Pasiuni: istoria, călătoriile, fotografia, muzica clasică

Comentarii (2)
Scrie un comentariu
Nume:

Comentariu:

15 + 10 =