L'obiettivo di questa esercitazione è la familiarizzazione con la ricorsione (capitolo 6).
Raccomandazioni: Ove non altrimenti indicato, rispondete alle domande prima ragionando su carta e poi provando a editare, compilare ed eseguire. Gli esercizi etichettati con l'asterisco (*) sono più difficili: affrontateli dopo aver risolto gli altri.
Obiettivo: Scrivere i primi metodi ricorsivi.
Attività:
class UniRicorsivo {
public static void main (String[] args) {
int[] a = {0,0,0,0,0,0,0,0,0,0};
assegnaUni(a,0);
for (int i = 0; i < a.length; i++)
System.out.print(a[i] + " ");
System.out.println();
}
static void assegnaUni(int[] v, int low) {
//COMPLETARE QUI
}
}
assegnaUni(int[]) che assegna 1 a tutti gli
elementi dell'array passato come parametro, richiamando il metodo
assegnaUni(int[], int) con gli argomenti
opportuni. Modificate anche il programma principale.assegnaI(int[], int) per assegnare
i a ogni elemento a[i] di un array
unidimensionale (e quindi 0 ad a[0],
1 ad a[1], e così via...).1 a tutti gli elementi di un array
bidimensionale. Suggerimento: Usate anche il metodo
assegnaUni(int[]) definito prima...Obiettivo: Scrivere altri metodi ricorsivi.
Attività:
inputSOrN() per il
controllo dell'input: il metodo deve leggere (usando
EasyIn.readChar()) un carattere in input finché
non viene letto 's' o 'S' o 'n' o
'N'. Sarà una funzione o una procedura?ackermann(0,n) = n+1 ackermann(m,0) = ackermann(m-1,1) ackermann(m,n) = ackermann(m-1,ackermann(m,n-1))Questa funzione è interessante perché vi mostra un esempio di funzione ricorsiva con ricorsione annidata. Questo significa che la funzione di Ackermann cresce molto rapidamente. Si consideri ad esempio che la funzione
f(x) =
ackermann(x,x) cresce molto più rapidamente di
qualsiasi polinomio o esponenziale. Già calcolando
ackermann(4,1) si può avere stack overflow!static boolean tuttiZeri(int[]
a, int i) per verificare se gli elementi di un array sono tutti
nulli fino alla posizione i.boolean. Scrivetene una versione ricorsiva che usa il
metodo tuttiZeri(int[], int) appena definito e
(opzionale) una versione iterativa.Obiettivo: Sull'utilità della ricorsione.
Attività:
Math.random() (che restituisce un double)
per "riempire" l'array (ossia, per assegnargli dei valori). Obiettivo: Scrivere ancora altri metodi ricorsivi.
Attività:
i in poi (ricorsivo
e iterativo). Nota: Questo metodo vi sarebbe stato utile per
l'esercizio 4.1: non l'avevate definito? Male...i a
j nulli (ricorsivo e iterativo).