2007 – 9

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:

  1. 48
  2. 96
  3. 102
  4. 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

  1. ES9(1): 1 è dispari, chiama foo(-2)
    foo(-2): -2 è pari, chiama ES9(-4)
    ES9(-4): -4 è pari, restituisce -4
  2. ES9(2): 2 è pari, restituisce 2
  3. ES9(3): 3 è dispari, chiama foo(0)
    foo(0): 0 è pari, chiama ES9(0)
    ES9(0): 0 è pari, restituisce 0
  4. 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)