Prova scritta 21/3/2002

Compito 2/Prova II

Esercizio 1

Dire cosa restituisce il seguente metodo ricorsivo:

static int unMetodo(int x, int y) {
  if(x==0)
    return 0;

  return unMetodo(x-1, y-1);
}

Soluzione

Se x ha valore negativo, il metodo invoca se stesso fino all'esarimento della memoria (infatti, il caso base non viene mai raggiunto, dato che x è sempre minore ad ogni invocazione). In questo caso, si può anche rispondere: ``il metodo va in ciclo infinito'', oppure ``il metodo si invoca all'infinito'': sono risposte accettabili.

Se x ha valore maggiore o uguale a zero, il metodo ritorna 0.


Esercizio 2

Descrivere la politica di accesso delle pile: se a un pila vuota vengono inseriti, in ordine, gli elementi 1, 5, 1 e 7, quale elemento viene estratto per primo?

Risposta

La politica di accesso è LIFO (Last In, First Out), ossia: viene estratto sempre l'ultimo elemento che è stato inserito.

Nel caso dell'esempio, il primo elemento che viene estratto è 7.


Esercizio 3

Il seguente metodo ricorsivo dovrebbe trovare il più piccolo elemento contenuto in un vettore. Ma non funziona. Perchè?

static int minimo(int vett[], int pos) {
  int min;

  if(pos==vett.length-1)
    return vett[pos];

  minimo(vett, pos+1);

  if(vett[pos]<min)
    min=vett[pos];

  return min;
}

Motivare la risposta (dire perchè non funziona).

Soluzione

Il metodo non funziona perchò si cerca di usare la tecnica del valore minimo trovato finora, ma ogni record di attivazione contiene una sua variabile min diversa dalle altre.

Il fatto che il valore di ritorno dell'invocazione ricorsiva vennisse scartato (ossia non venisse messo in una variabile o usato in una espressione) era un chiaro segno che l'invocazione ricorsiva non aveva alcun effetto.