Ricorsione - Ateneonline

annuncio pubblicitario
Fondamenti di informatica
Oggetti e Java
Luca Cabibbo
Ricorsione
Capitolo 22
marzo 2004
1
Ricorsione
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Definizioni induttive
La ricorsione è una tecnica di programmazione basata sulla
definizioni di metodi e classi (tipi) ricorsivi
 la ricorsione è connessa alla nozione matematica di induzione
 un insieme è definito in modo induttivo se è definito in
termini di se stesso
 una funzione è definita in modo induttivo se è definita in
termini di se stessa
2
Ricorsione
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Definizione induttiva di insiemi
Un insieme definito in modo induttivo è un insieme definito in
termini di se stesso
 l’insieme N dei numeri naturali
 0  N
 se n  N, allora anche n+1  N
 l’insieme S delle stringhe su un alfabeto  di caratteri
 ""  S
 se CAR   e S  S, allora anche CAR+S  S
 l’insieme delle espressioni Java sugli interi
 l’insieme delle istruzioni di Java
Nella definizione induttiva di un insieme è possibile identificare
 uno o più casi base
 uno o più casi induttivi
3
Ricorsione
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Definizione induttiva di funzioni
Una funzione definita in modo induttivo è una funzione definita in
termini di se stessa
 nella definizione induttiva di una funzione è possibile
identificare
 uno o più casi base
 uno o più casi induttivi
 i diversi casi partizionano il dominio della funzione
4
Ricorsione
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Esempio — la funzione fattoriale
La funzione fattoriale N! (N fattoriale), con N naturale, è definita in
modo “iterativo” come segue (con l’avvertenza che 0! vale 1)
N! = 12 ... (N-2)(N-1)N
Definizione induttiva della funzione fattoriale
1
se N=0 – caso base
N  (N-1)!
se N>0 – caso induttivo
N! =
5
Ricorsione
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Esempio — la funzione cifre
Sia cifre(N) una funzione, definita per N naturale, tale che
cifre(N) è il numero di cifre decimali nella rappresentazione
decimale del numero naturale N
 ad esempio, cifre(765) vale 3, cifre(8) e cifre(0) valgono 1
Definizione induttiva della funzione cifre(N), con N naturale (il
simbolo / indica la divisione intera)
1
se N<10
1 + cifre(N/10)
se N>=10
cifre(N) =
6
Ricorsione
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Esempio — massimo comun divisore
Massimo comun divisore di due numeri interi positivi
mcd(N, M) =
7
N (oppure M) se N=M
mcd(N-M, M) se N>M
mdc(N, M-N) se N<M
Ricorsione
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Metodi ricorsivi
La ricorsione è una tecnica di programmazione utile ed efficace
nell’implementazione di operazioni (metodi) su insiemi e tipi di
dato definiti in modo induttivo
 un metodo ricorsivo è un metodo che, direttamente o
indirettamente, può invocare se stesso
8
Ricorsione
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Definizione di metodi ricorsivi
N! =
1
se N=0 – caso base
N  (N–1)!
se N>0 – caso induttivo
/* Calcola il fattoriale del numero naturale n. */
public static int fattoriale(int n) {
// pre: n>=0
int nfatt;
// il fattoriale di n
if (n==0)
// caso base
nfatt = 1;
else
// caso induttivo
nfatt = n * fattoriale(n-1);
return nfatt;
}
9
Ricorsione
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Esempio — il metodo cifre
1
se N<10
1 + cifre(N/10)
se N>=10
cifre(N) =
/* Calcola il numero di cifre nella rappresentazione
* decimale di n. */
public static int cifre(int n) {
// pre: n>=0
int c;
// il numero di cifre nella
// rappresentazione decimale di n
if (n<10)
// caso base
c = 1;
else
// caso induttivo
c = 1 + cifre(n/10);
return c;
}
10
Ricorsione
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Esecuzione di metodi ricorsivi
Che cosa accade durante l’esecuzione di fattoriale(2)?
 l’esecuzione dei metodi ricorsivi viene gestita con il modello
basato su pila di attivazione e record di attivazione
 un diverso record di attivazione per ciascuna differente
attivazione di fattoriale
esecutore
fattoriale punto di ritorno
a
n
nfatt
11
Ricorsione
…
m, ..., ...
2
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Esecuzione di metodi ricorsivi
Calcolo di fattoriale(2)
12
esecutore
fattoriale punto di ritorno
b
n
nfatt
…
a, ..., ...
1
esecutore
fattoriale punto di ritorno
a
n
nfatt
…
m, ..., ...
2
Ricorsione
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Esecuzione di metodi ricorsivi
Calcolo di fattoriale(2)
13
esecutore
fattoriale punto di ritorno
c
n
nfatt
…
b, ..., ...
0
esecutore
fattoriale punto di ritorno
b
n
nfatt
…
a, ..., ...
1
esecutore
fattoriale punto di ritorno
a
n
nfatt
…
m, ..., ...
2
Ricorsione
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Esecuzione di metodi ricorsivi
Calcolo di fattoriale(2)
14
esecutore
fattoriale punto di ritorno
c
n
nfatt
…
b, ..., ...
0
1
esecutore
fattoriale punto di ritorno
b
n
nfatt
…
a, ..., ...
1
esecutore
fattoriale punto di ritorno
a
n
nfatt
…
m, ..., ...
2
Ricorsione
1
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Esecuzione di metodi ricorsivi
Calcolo di fattoriale(2)
15
esecutore
fattoriale punto di ritorno
b
n
nfatt
…
a, ..., ...
1
1
esecutore
fattoriale punto di ritorno
a
n
nfatt
…
m, ..., ...
2
Ricorsione
1
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Esecuzione di metodi ricorsivi
Calcolo di fattoriale(2)
esecutore
fattoriale punto di ritorno
a
n
nfatt
16
Ricorsione
…
m, ..., ...
2
2
2
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Progettazione di metodi ricorsivi
Linee guida per la progettazione di metodi ricorsivi
 determina i casi base
 determina i casi induttivi
 verifica che i casi base e induttivi partizionano l’insieme dei
dati di ingresso per il metodo
 usa una istruzione condizionale per selezionare qual è il caso
corrente
 può essere utile dichiarare una variabile per memorizzare il
risultato del metodo
 talvolta è necessario scrivere anche un metodo per avviare la
ricorsione (mostrato più avanti)
17
Ricorsione
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Esempio — il metodo mcd
mcd(N, M) =
N (oppure M) se N=M
mcd(N-M, M) se N>M
mdc(N, M-N) se N<M
/* Calcola il massimo comun divisore di n e m. */
public static int mcd(int n, int m) {
// pre: n>0 && m>0
int mcd;
// massimo comun divisore di n e m
/* calcola il massimo comun divisore di n e m
* usando l'algoritmo di Euclide */
if (n==m)
// caso base
mcd = n;
else if (n>m)
// caso induttivo
mcd = mcd(n-m, m);
else
// altro caso induttivo, n<m
mcd = mcd(n, m-n);
return mcd;
}
18
Ricorsione
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Errori comuni
Alcuni errori comuni nella scrittura di metodi ricorsivi
 errori nella gestione dei casi base e induttivi
 errori nella definizione del caso base
 errori nella definizione del caso induttivo
19
Ricorsione
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Errori nella gestione dei casi
Uso di una sequenza di istruzioni if
/* Calcola il fattoriale del numero naturale n. */
public static int fattoriale(int n) {
// pre: n>=0
int nfatt;
// il fattoriale di n
if (n==0)
// caso base
nfatt = 1;
if (n>0)
// caso induttivo, SBAGLIATO
nfatt = n * fattoriale(n-1);
return nfatt;
}

20
il metodo non viene compilato correttamente
Ricorsione
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Errori nella gestione dei casi
Un errore simile
/* Calcola il fattoriale del numero naturale n. */
public static int fattoriale(int n) {
// pre: n>=0
int nfatt;
// il fattoriale di n
if (n==0)
// caso base
nfatt = 1;
else if (n>0)
// caso induttivo, SBAGLIATO
nfatt = n * fattoriale(n-1);
return nfatt;
}
21
Ricorsione
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Errori nella gestione dei casi
Un possibile errore nella gestione dei casi
/* Calcola il fattoriale del numero naturale n. */
public static int fattoriale(int n) {
// pre: n>=0
int nfatt;
// il fattoriale di n
if (n==1)
// caso base, SBAGLIATO
nfatt = 1;
else
// caso induttivo
nfatt = n * fattoriale(n-1);
return nfatt;
}
22
Ricorsione
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Errori nella definizione del caso base
Un possibile errore nella definizione del caso base
/* Calcola il fattoriale del numero naturale n. */
public static int fattoriale(int n) {
// pre: n>=0
int nfatt;
// il fattoriale di n
if (n==0)
// caso base
nfatt = 0;
// NO, sbagliato
else
// caso induttivo
nfatt = n * fattoriale(n-1);
return nfatt;
}
23
Ricorsione
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Errori nella definizione del caso induttivo
Un possibile errore nella definizione del caso induttivo
/* Calcola il fattoriale del numero naturale n. */
public static int fattoriale(int n) {
// pre: n>=0
int nfatt;
// il fattoriale di n
if (n==0)
// caso base
nfatt = 1;
else
// caso induttivo
nfatt = n * fattoriale(n);
// NO, sbagliato
return nfatt;
}
24
Ricorsione
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Ricorsione lineare e non lineare
Ricorsione lineare
 ciascuna attivazione del metodo ricorsivo causa direttamente
al massimo un’altra attivazione ricorsiva dello stesso metodo
Ricorsione non lineare
 una attivazione del metodo ricorsivo può causare direttamente
due o più ulteriori attivazioni ricorsive dello stesso metodo
 la pila di attivazione può evolvere in modo complesso
25
Ricorsione
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Esempio — numeri di Fibonacci
I numeri di Fibonacci sono definiti, per N naturale, come segue
fib(N) =

1
se N=0
1
se N=1
fib(N-1) + fib(N-2) se N>1
ad esempio, fib(3) = fib(2)+fib(1) = (fib(1)+fib(0))+fib(1) = 3
/* Calcola l'n-esimo numero di Fibonacci. */
public static int fib(int n) {
// pre: n>=0
int f;
// n-esimo numero di Fibonacci
if (n==0 || n==1)
// casi base
f = 1;
else
// caso induttivo
f = fib(n-1) + fib(n-2);
return f;
}
26
Ricorsione
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Tipi ricorsivi
Un tipo ricorsivo è un tipo definito in termini di se stesso
Esempio
 si vuole definire una classe CorpoCeleste per modellare i
corpi celesti (il sole, i pianeti e i satelliti) del sistema solare
 di ciascun corpo celeste si vogliono rappresentare le seguenti
proprietà
 il nome – una stringa
 il centro di rotazione del corpo celeste centroRotazione –
che è un altro corpo celeste (è di tipo CorpoCeleste)
27
Ricorsione
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Corpi celesti — oggetti
Alcuni oggetti CorpoCeleste
mars
nome = "marte"
centroRotazione
moon
earth
nome = "luna"
centroRotazione
28
nome = "terra"
centroRotazione
Ricorsione
sun
nome = "sole"
centroRotazione = null
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Corpi celesti — variabili d’istanza
La classe CorpoCeleste ha una definizione ricorsiva
/* Un oggetto CorpoCeleste rappresenta un corpo celeste. */
class CorpoCeleste {
/* Il nome del corpo celeste. */
private String nome;
/* Il centro di rotazione del corpo celeste,
* ovvero il corpo celeste intorno a cui
* avviene la rotazione. */
private CorpoCeleste centroRotazione;
... altro ...
}

29
qual è il caso base?
Ricorsione
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Tipi ricorsivi e metodi ricorsivi
Nel caso dei corpi celesti, si vuole scrivere il metodo String
toString() che calcola una descrizione di un corpo celeste
 la descrizione deve comprendere sia il nome del corpo
celeste che una descrizione del centro di rotazione del corpo
celeste
sun.toString() deve restituire "sole"
earth.toString() deve restituire "terra (ruota intorno a sole)"
moon.toString() deve restituire
"luna (ruota intorno a terra (ruota intorno a sole))"
30
Ricorsione
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
CorpoCeleste — String toString()
/* Calcola la descrizione testuale
* di questo corpo celeste. */
public String toString() {
String descrizione;
descrizione = nome;
if (centroRotazione!=null)
// caso induttivo
descrizione += " (ruota intorno a " +
centroRotazione.toString() + ")";
return descrizione;
}
31
Ricorsione
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Ricorsione e stringhe
L’insieme S delle stringhe su un alfabeto  di caratteri
 ""  S
 se CAR   e S  S, allora anche CAR+S  S
Come definire metodi ricorsivi che operano su stringhe?
 solitamente il caso base è relativo alla stringa vuota
 il caso induttivo è relativo a stringhe non vuote, considerate
formate da un carattere seguito da una stringa
 primo(S) e resto(S)
32
Ricorsione
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Esempio — inversione di stringhe
La funzione inversa(S) rappresenta la stringa inversa di S
 la stringa ottenuta da S invertendone l’ordine dei caratteri
""
se S è vuota
inversa(S) =
inversa(resto(S)) + primo(s)
se s è non vuota
33
Ricorsione
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Esempio — inversione di stringhe
/* Calcola l’inversa della stringa s, ovvero la stringa
* ottenuta da s invertendone l’ordine dei caratteri. */
public static String inversa(String s) {
// pre: s!=null
String inv;
// l’inversa di s
if (s.length()==0)
// caso base
inv = "";
else
// caso induttivo
inv = inversa(s.substring(1)) + s.charAt(0);
return inv;
}
34
Ricorsione
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Esempio – uguaglianza tra stringhe
/* Verifica se le stringhe s e t sono uguali. */
public static boolean uguali(String s, String t) {
// pre: s!=null && t!=null
boolean ug;
// s e t sono uguali
if (s.length()==0 && t.length()==0)
// caso base
/* entrambe le stringhe sono vuote */
ug = true;
else if (s.length()>0 && t.length()>0) // caso induttivo
/* entrambe le stringhe sono non vuote */
ug = (s.charAt(0)==t.charAt(0)) &&
uguali(s.substring(1), t.substring(1));
else
// altro caso base
/* solo una delle stringhe è vuota */
ug = false;
return ug;
}
35
Ricorsione
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Ricorsione e array
Per gestire gli array in modo ricorsivo
 in genere la ricorsione non viene effettuata sugli array
 ma piuttosto sugli indici usati per accedere l’array
36
Ricorsione
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Somma degli elementi di un array di interi
/* Calcola la somma degli elementi dell'array a. */
public static int somma(int[] a) {
// pre: a!=null
/* calcola la somma degli elementi di a
* a partire da quello di indice 0 */
return somma(a, 0);
}
/* Calcola la somma degli elementi di a che hanno indice
* maggiore o uguale a i. */
private static int somma(int[] a, int i) {
// pre: a!=null && i>=0 && i<=a.length
int s;
// la somma degli elementi di a
// che hanno indice maggiore o uguale a i
if (a.length<=i)
// caso base: "porzione" vuota
s = 0;
else
// caso induttivo: "porzione" non vuota
s = a[i] + somma(a, i+1);
return s;
}
37
Ricorsione
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Ricerca binaria
L’algoritmo di ricerca binaria può anche essere implementato in
modo ricorsivo
/* Ricerca chiave nell'array a ordinato in modo
* non descrescente, restituendo l'indice di un
* elemento di a uguale a chiave (oppure -1).
* Implementazione ricorsiva della ricerca binaria. */
public static int ricercaBinaria(int[] a, int chiave) {
// pre: a!=null &&
//
a è ordinato in modo non decrescente
/* cerca chiave tra tutti gli elementi di a */
return ricBinRic(a, chiave, 0, a.length);
}
38
Ricorsione
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Ricerca binaria
/* Verifica se a contiene un elemento uguale a chiave
* di indice tra sinistra (compreso) e destra (escluso). */
private static int ricBinRic(int[] a, int chiave,
int sinistra, int destra) {
int posizione;
// posizione di un elemento di a
// uguale a chiave, se esiste
int centro;
// indice dell'elemento centrale dello
// spazio di ricerca
/* cerca l'indice di un elemento di a, tra sinistra
* e destra, uguale a chiave */
centro = (sinistra+destra)/2;
if (sinistra>=destra)
// la ricerca è fallita
posizione = -1;
else if (a[centro]==chiave)
// trovato!
posizione = centro;
else if (a[centro]>chiave) // continua a sinistra
posizione = ricBinRic(a, chiave, sinistra, centro);
else
// continua a destra
posizione = ricBinRic(a, chiave, centro+1, destra);
return posizione;
}
39
Ricorsione
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Quando usare (o non usare) la ricorsione
Per ogni metodo ricorsivo, è sempre possibile implementare un
metodo iterativo che si comporta in modo equivalente
 in quali casi è opportuno risolvere un problema in modo
ricorsivo e in quali casi è opportuno risolverlo in modo
iterativo?
 alcuni criteri per scegliere
 la ricorsione può essere usata in modo naturale nel calcolo
di funzioni definite induttivamente e nell’elaborazione di
dati di tipo ricorsivo e di insiemi definiti in modo induttivo
 tempo di esecuzione e occupazione di memoria
 costo (umano) della soluzione del problema
40
Ricorsione
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Esempio — contenuto di un file system
Nei file system di un calcolatore, i documenti sono memorizzati in
una struttura gerarchica
 per file si intende un documento oppure una cartella
Si vuole scrivere un metodo che, dato un file (documento o
cartella), stampa la struttura del file system a partire da quel file

progetti
c:\progetti
c:\progetti\alfa
alfa
beta
gamma.txt


c:\progetti\alfa\alfa.doc
c:\progetti\beta
alfa.doc beta.doc budget.xls
c:\progetti\beta\beta.doc
c:\progetti\beta\budget.xls
c:\progetti\gamma.txt
41
Ricorsione
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
La classe File
Va usata la classe File del package java.io
 un oggetto File è una rappresentazione astratta di un file
(documento o cartella) e del suo nome
 ad esempio, di c:\progetti o di c:\progetti\gamma.txt
 è possibile creare un oggetto File a partire dal nome del file
da rappresentare
 il metodo String toString() restituisce il nome del file
 ad esempio, la stringa c:\progetti\gamma.txt
 il metodo boolean exists() verifica se il file esiste
 il metodo boolean isFile() verifica se il file esiste ed è un
documento
 il metodo boolean isDirectory() verifica se il file esiste ed è
una cartella
 se il file è una cartella, il metodo File[] listFiles() restituisce
l’elenco dei file contenuti nella cartella
42
Ricorsione
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Contenuto di un file system
Si vuole scrivere un metodo void dir(File f) che visualizza il
contenuto del file system a partire da f
 ad esempio
dir( new File("c:\\Progetti") );
Il metodo void dir(File f) può essere implementato ricorsivamente
 casi possibili
 f non esiste – !f.exists()
 f è un documento – f.isFile()
 f è una cartella – f.isDirectory()
43
Ricorsione
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Il metodo void dir(File f)
/* Visualizza il contenuto del file system
* a partire dal file f. */
public static void dir(File f) {
// pre: f!=null
File[] elencoFile;
// elenco dei file contenuti in f,
// se f è una cartella
int i;
// indice per la scansione di elencoFile
/* stampa il contenuto del file system a partire da f */
if (f.isFile()) {
// caso base
/* f è un documento, stampane il nome */
System.out.println(f.toString());
} else if (f.isDirectory()) {
// caso induttivo
/* f è una cartella, stampane il nome
* e, ricorsivamente, il contenuto */
System.out.println(f.toString());
elencoFile = f.listFiles();
for (i=0; i<elencoFile.length; i++)
dir(elencoFile[i]);
} /* altro caso base, f non esiste */
}
44
Ricorsione
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Esercizio
Esercizio (difficile)
 (provare a) scrivere un metodo non ricorsivo equivalente al
metodo void dir(File f)
45
Ricorsione
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Scarica