Si considerino le funzioni mutuamente ricorsive
int foo(int n); int ES9(int n) { if(n%2 == 1) return foo(n-3); else return n; } int foo(int n) { if(n%2 == 0) return ES9(2*n); else return n; }
Dire cosa restituisce la chiamata ES9(51).
Risposte:
- 48
- 96
- 102
- nessuna delle precedenti
Soluzione: b (96)
Considera i passi successivi alla chiamata ES9(51)
ES9(51): 51 è dispari, chiama foo(48)
foo(48): 48 è pari, chiama ES9(96)
ES9(96), 96 è pari, restituisce 96
In effetti
- ES9(1): 1 è dispari, chiama foo(-2)
foo(-2): -2 è pari, chiama ES9(-4)
ES9(-4): -4 è pari, restituisce -4 - ES9(2): 2 è pari, restituisce 2
- ES9(3): 3 è dispari, chiama foo(0)
foo(0): 0 è pari, chiama ES9(0)
ES9(0): 0 è pari, restituisce 0 - ES9(4): 4 è pari, restituisce 4
- …
Osserva il comportamento
- n è pari
- ES9(n) restituisce n
- n è dispari
- ES9(n): chiama foo(n-3)
- foo(n-3): n-3 è pari, chiama ES9(2*(n-3))
- ES9(2*(n-3)): 2*(n-3) è pari, restituisce 2*(n-3)