Exercitii rezolvate - functii

Citiți definițiile funcțiilor de mai jos și răspundeți întrebărilor  !

Fie funcția:

int f(int x)

        {return x+1;}

void t(int a)

  {cout<<++a;}

Ce se va afișa ca urmare a apelului t(f(f(f(1)))) ?

Soluție: t(f(f(f(1))))=t(f(f(2)))=t(f(3))=t(4)=5.

Fie funcția f, definită mai jos:

void f(long n, int i)

{

if(n!=0)

          if(n%3>0){

        cout<<i;

        f(n/3,i+1); }

}

Precizați ce se va afișa ca urmare a apelului f(121,1); !

Soluție: ca urmare a apelului vor rezulta o serie de afișări ale valorilor pe care variabila locală i le va avea în diferitele instanțe ale funcției.Remarcăm că funcția este recursivă, realizând, după afișare, auto-apelul, cu valori diferite ale parametrilor efectivi. Lista valorilor afișate va fi: 12345

Se dă funcţia F cu definiţia următoare.

int F(int x){

if (x<=1) return x;

  else return x+F(x-2);

}

Ce valoare are F(18)?

Soluție: F(18)=18+F(16)=18+16+F(14)=...=18+16+14+...+F(0)=90

Se consideră subprogramul f definit mai jos. Ce se va afişa în urma apelului f(12345);?

void f(long int n)

{

   if (n!=0){

        f(n/10);

       cout<<n%10<<’ ’;}

}

Soluție: în definirea acestei funcții recursive se observă că autoapelul se face anterior afișării. Prin urmare, această operație este suspendată până la Soluțiea tuturor apelurilor interioare. Ordinea de afișare a valorilor va fi, așadar, inversă. Valorile afișare de funție vor fi, în ordine: 1 2 3 4 5

5.  Se consideră subprogramul f, definit mai jos. Ce se afişează ca urmare a apelului f('a'); ?

void f(char c)

{

   if (c != 'e')

        {f(c+1);

         cout<<c;}

}

Soluție: dcba

Scrieți definiții pentru următoarele funcții:

Funcţia desc primeşte ca parametri două numere naturale, n şi k, şi returnează puterea la care apare k în descompunerea lui n.

Soluție:

int desc(long n, int k)

{   int p=0;

  while(n%k==0)

        {p++;

         n=n/k;}

  return p;

}

Funcţia cmmdc primeşte ca parametri două numere naturale şi returnează cel mai mare divizor comun al lor, utilizând algoritmul lui Euclid.

Soluție:

int cmmdc(int a, int b)

{   int r;

  while(a%b!=0){

      r=a%b;

      a=b;b=r;}

  return b;

}

Subprogramul baza primește ca parametri două numere naturale n și k (2<=k<=9), reprezentate în baza 10,  și returnează numărul n convertit în baza k.

Soluție:

int baza(int n, int k){

if(n>=k){

      baza(n/k, k);

      cout<<n%k;}

  else cout<<n;}

Subprogramul ordonare primeşte prin parametrul x un tablou unidimensional cu cel mult  100 de elemente numere reale, iar prin parametrul n un număr întreg ce reprezintă numărul efectiv de elemente ale tabloului x. Subprogramul foloseste metoda sortării prin selecție pentru a ordona crescător elementele tabloului şi furnizează, prin intermediul parametrului x, tabloul astfel ordonat.

Soluție:

void ordonare(float x[100], int n){

  int pozitie, i, j;

  float minim, aux;

  for(i=0;i<n-1;i++)    {

      minim=x[i];

      pozitie=i;

      for(j=i+1;j<n;j++){

            if(x[j]<minim) {minim=x[j];pozitie=j;}

        aux=x[i];

  x[i]=minim;

          x[pozitie]=aux;  }

}

Subprogramul fibo are  doi parametri, n şi v, numere naturale, (1<n<30). El primeşte, prin intermediul parametrului n, un număr natural şi furnizează, prin intermediul parametrului v, un tablou  unidimensional care conţine primii n termeni ai şirului lui Fibonacci (şirul lui Fibonacci este construit după regula a\_n={█(0,dacă n=0@1,dacă n=1@a\_(n-1)+a\_(n-2),altfel)┤).

Soluție:

void fibo(int v[30], int n){

v[0]=0;

v[1]=1;

for(int i=2;i<=n;i++)

   v[i]=v[i-1]+v[i-2];}