Prova scritta 21/3/2002

Compito 1/Prova II

Esercizio 1

Dire cosa fa il seguente metodo ricorsivo:

static boolean unMetodo(int x, int y) {
  x=y+1;

  if(x==0)
    y=0;

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

Soluzione

Il metodo non contiene nessun caso base. Infatti, la chiamata ricorsiva viene fatta indipendentemente dai valori dei parametri.

Il metodo viene quindi invocato fino ad esaurimento della memoria disponibile. ``Il metodo non ritorna", oppure ``il metodo si invoca all'infinito'', ``si genera un ciclo infinito'', ecc. erano risposte accettabili.


Esercizio 2

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

Risposta

La politica di accesso è FIFO (First In, First Out): viene estratto per primo l'elemento che è stato inserito per primo.

Nell'esempio, il primo elemento a essere estratto è 1


Esercizio 3

Il seguente metodo ricorsivo dovrebbe calcolare la somma dei nodi di una catena. Ma non funziona. Perchè?

static int sommaCatena(Catena c) {
  int acc=0;

  if(c==null) {
    acc=0;
    return acc;
  }

  acc=acc+c.getVal();

  sommaCatena(c.getNext());

  return acc;
}

Motivare la risposta (dire perchè non viene ritornato il valore corretto).

Riposta

Il metodo dovrebbe calcolare la somma dei nodi usando la tecnica dell'accumulatore. Ma ogni record di attivazione ha una sua variabile acc 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.