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).