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)?
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<<” “
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++
a) void t (int & x, int y);
b) void t (int & x, int & y);
c) void t (int x, int & y);
                                R: a)

Test i

  • 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)