Esercizio 10A
Seguire l'evoluzione della pila dei record di attivazione usando il debugger
di BlueJ per il programma
Fibonacci.java
.
Per fare ciò, procedere come segue:
Open Non BlueJ
);
Fibonacci
;
Fibonacci.java
e mettere un breakpoint alla
linea 17 (prima istruzione del metodo main
); per mettere un
breakpoint ad un'istruzione, posizionare il cursore sull'istruzione e
usare il comando Set/Clear Breakpoint
del menu
Tools
(oppure cliccare semplimente sul bordo sinistro
accanto all'istruzione);
main
eseguendo le istruzioni passo/passo
(utilizzare i pulsanti Step
Step Into
della finestra del debugger).
fibonacci
rimanga sospeso nel punto in cui ha effettuato una delle due attivazioni
ricorsive, e come dopo il ritorno dalla prima attivazione ricorsiva venga
eseguita la seconda attivazione ricorsiva.
Esercizio 10B
Si consideri un'area paludosa costituita da R×C zone quadrate, con R e C noti, ognuna delle quali può essere una zona di terraferma (transitabile) o una zona di sabbia mobile (non transitabile). Ogni zona della palude è identificata da una coppia di coordinate < r, c >, con 0 < = r < R e 0 < = c < C. Diremo che r rappresenta la riga e c la colonna della zona < r, c >. Per passaggio si intende una sequenza di zone di terraferma adiacenti che attraversano la palude da sinistra (colonna pari a 0) a destra (colonna pari ad C - 1). Siamo interessati ai passaggi in cui ad ogni passo ci si muove verso destra, per cui da una zona in colonna c si va ad una zona in colonna c + 1. In altre parole, la zona in posizione < r, c > si considera adiacente alle zone in posizione < r - 1, c + 1 >, < r, c + 1 > e < r + 1, c + 1 >, come mostrato nella seguente figura.
Nella figura che segue, il carattere '*' rappresenta una zona di terraferma mentre il carattere 'o' rappresenta una zona di sabbia mobile. La palude 1 è senza passaggi, mentre la palude 2 ha un passaggio (evidenziato, usando '#' al posto di '*').
Per rappresentare una palude, si utilizzi la classe Palude
già realizzata (file Palude.java
)
che esporta i seguenti metodi:
Palude(int righe, int colonne, double probTerra)
int getNumRighe()
int getNumColonne()
boolean terra(int r, int c)
String toString()
Si richiede di verificare l'esistenza di almeno un passaggio e stamparlo se esiste (se ne esiste più di uno è sufficiente stampare il primo trovato). In particolare, si richiede di trovare una sequenza di zone della palude, in cui la prima posizione sia in colonna 1, mentre l'ultima sia in colonna C. Ogni posizione della sequenza deve essere adiacente alla successiva. Per esempio, se la prima posizione è < 3, 1 >, la seconda può essere < 4, 2 >, ma non < 3, 3 >. Dal momento che ad agni passo dobbiamo muoverci verso destra, il percorso sarà lungo esattamente C passi.
Per rappresentare un cammino, facciamo notare che esso deve avere lunghezza
C, ovvero pari al numero di colonne della palude, e che le zone
attraversate dal cammino stanno su righe successive a partire da 0 fino ad
arrivare ad C - 1. Quindi, possiamo usare un array di C elementi
interi, nel quale il valore del generico elemento di indice c è
pari all'indice r di riga della posizione < r, c >
attraversata dal cammino. Ad esempio il cammino evidenziato nella
palude 2 di sopra è rappresentato dall'array
{
1,2,3,3,3,2}
.
Si realizzi una classe cliente della classe Palude
che contiene
i seguenti metodi statici:
static boolean cercaCammino(Palude p, int r, int c, int[] camm)
p
e le coordinate
r
e c
di una zona, determini se esiste nella
palude un cammino dalla zona <r
,c
> al
bordo destro; se tale cammino esiste, l'array camm
passato come parametro deve essere aggiornato in modo che le componenti
da quella di indice c
in poi contengano le posizioni del
cammino trovato.
static boolean attraversaPalude(Palude p, int[] camm)
p
ed un array
camm
(che si può supporre già creato, ma i cui
valori non sono ancora inizializzati), verifica l'esistenza di un cammino
che attraversa la palude a partire da tutte le posizioni della prima
colonna; se esiste un cammino, l'array camm
dovrà
contenere la rappresentazione di tale cammino, come descritto sopra.
static String stringaCammino(Palude p, int[] camm)
p
ed un array
camm
che rappresenta un cammino, restituisce una stringa che
rappresenta la palude p
in cui il cammino
camm
è evidenziato usando il carattere '#'.
static void main(String[] args)
attraversaPalude
e, se esiste, lo
stampa usando stringaCammino
.