2006 – 7

Cosa stampa il seguente programma?

#include 

int mistero(int m, int n)
{
    if(m == 0)
        return n;
    else if(n == 0)
        return mistero(m-1, 1);
    else
        return mistero(n-1, mistero(m-1, n-1));
}

int main()
{
    printf("%d %d %d %d\n", mistero(0,3), mistero(1,3), mistero(2,3), mistero(3,3));
    return 0;
}

Risposte:

  1. 3 1 2 0
  2. 3 1 1 0
  3. 3 1 0 1
  4. nessuna delle precedenti

Soluzione: c (3 1 0 1)


Compila la tabella (con molta attenzione…)

m/n
0 1 2 3
0 m(0,0)
0
m(0,1)
1
m(0,2)
2
m(0,3)
3
1 m(1,0)
m(0,1)
1
m(1,1)
m(0,m(0,0))
m(0,0)
0
m(1,2)
m(1,m(0,1))
m(1,1)
0
m(1,3)
m(2,m(0,2))
m(2,2)
1
2 m(2,0)
m(1,1)
0
m(2,1)
m(0,m(1,0))
m(0,1)
1
m(2,2)
m(1,m(1,1))
m(1,0)
1
m(2,3)
m(2,m(1,2))
m(2,0)
0
3 m(3,0)
m(2,1)
1
m(3,1)
m(0,m(2,0))
m(0,0)
0
m(3,2)
m(1,m(2,1))
m(1,1)
0
m(3,3)
m(2,m(2,2))
m(2,1)
1

Osserva l’alternativa

m(3,3) = m(2, m(2,2)) = m(2,m(1,m(1,1))) = m(2,m(1,m(0,m(0,0))) = m(2,m(1,m(0,0)) = m(2,m(1,0)) = m(2,m(0,1)) = m(2,1) = m(0,m(1,0)) = m(0,1) = 1