2003 – 3

Si considerino le due seguenti funzioni:

int A(int n)
{
   if(n > 0)
     return n+A(n-1);
   else
     return 0;
}

int B(int n)
{
   return(n*(n+1)/2);
}

Quale delle seguenti affermazioni è vera?

Risposte:

  1. la funzione A() calcola il fattoriale di un numero mentre la funzione B() calcola la sommatoria di tutti i numeri compresi fra 1 ed n.
  2. sia la funzione A() che la funzione B() calcolano la sommatoria di tutti i numeri compresi fra 1 ed n, assumendo n maggiore o uguale a 1.
  3. la funzione A() e la funzione B() calcolano esattamente la stessa funzione.
  4. nessuna delle precedenti affermazioni è vera.

Soluzione: b (sia la funzione A che la funzione B calcolano la sommatoria di tutti i numeri compresi fra 1 ed n, assumendo n maggiore o uguale a 1.)


La funzione A() calcola ricorsivamente

A(n) = n+A(n-1)

  • n+(n-1) + A(n-2)
  • n+(n-1) + (n-2) + … + 2 + 1 + A(0)
  • n+(n-1) + (n-2) + … + 2 + 1 + 0

La funzione B() calcola lo stesso risultato con la formula…

Prova

n A(n) B(n)
0 0 0*1/2
0
1 1+A(0)
1+0
1
1*2/2
1
2 2+A(1)
2+1
3
2*3/2
3
3 3+A(2)
3+3
6
3*4/2
6
4 4+A(3)
4+6
10
4*5/2
10
5 5+A(4)
5+10
15
5*6/2
15