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:
- 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.
- 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() e la funzione B() calcolano esattamente la stessa funzione.
- 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 |
… | … | … |