Lucidi su semplici impieghi della ricorsione

Transcript

Lucidi su semplici impieghi della ricorsione
Scaletta
Gli aggregati ci servono ?
Possiamo farne a meno ?
Programmazione
( Aggregati, al di là delle stringhe.
Primi esempi di ricorsione. )
Eugenio Omodeo
Università degli Studi di Trieste.
Trieste, 25.10.2011
Eugenio Omodeo
Università degli Studi di Trieste.
Programmazione ( Aggregati, al di là delle stringhe. Primi esem
Scaletta
Gli aggregati ci servono ?
Possiamo farne a meno ?
Gli aggregati ci servono ?
Possiamo farne a meno ?
Eugenio Omodeo
Università degli Studi di Trieste.
Programmazione ( Aggregati, al di là delle stringhe. Primi esem
Scaletta
Gli aggregati ci servono ?
Possiamo farne a meno ?
Polinomi
In un caso semplice, se ad es. vogliamo risolvere un’equazione della
forma
a · x2 + b · x + c = 0 ,
ci bastano poche variabili: a b c
Ma se l’equazione può aver grado qualsiasi ?
O se, piú semplicemente, vogliamo valutare un polinomio quale
−6 · x 3 + 3 · x 2 − 8
per un dato valore della sua indeterminata, ad es. per x
Eugenio Omodeo
Università degli Studi di Trieste.
= 5
?
Programmazione ( Aggregati, al di là delle stringhe. Primi esem
Scaletta
Gli aggregati ci servono ?
Possiamo farne a meno ?
Foto
Potremmo pensare di rappresentare una foto coma una griglia
rettangolare finissima che ha in ogni celletta un numero esprimente
una tonalità di grigio ( o un colore ).
Poter lavorare sulle foto al computer, significherà poter manipolare
opportunamente una matrice di pixel.
Eugenio Omodeo
Università degli Studi di Trieste.
Programmazione ( Aggregati, al di là delle stringhe. Primi esem
Scaletta
Gli aggregati ci servono ?
Possiamo farne a meno ?
Altre matrici
La nozione di matrice è centralissima in certi settori dell’algebra;
noi parleremo, invece, di
array: detti anche vettori, intesi come sequenze di entità
omogenee;
array bidimensionali: matrici in senso proprio, intesi come griglie di
entità omogenee;
array tri- o pluri-dimensionali.
Un problema basilare in quest’ambito è la risoluzione di sistemi di
equazioni lineari.
Eugenio Omodeo
Università degli Studi di Trieste.
Programmazione ( Aggregati, al di là delle stringhe. Primi esem
Scaletta
Gli aggregati ci servono ?
Possiamo farne a meno ?
Sudoku
Anche in questo caso ci serve una matrice ( quadrata ), dove però
i numeri non rappresentano sfumature di colore e durante la
soluzione alcune caselle possono essere vuote.
Il problema è la trovare la soluzione, i.e. riempire le caselle in
modo che. . . . . .
Eugenio Omodeo
Università degli Studi di Trieste.
Programmazione ( Aggregati, al di là delle stringhe. Primi esem
Scaletta
Gli aggregati ci servono ?
Possiamo farne a meno ?
Triangolo di Tartaglia ( o di Pascal ) -I
1
1
1
1
1
..
.
1
2
3
4
6
..
.
..
.
1
3
1
4
1
..
.
..
.
Fra le applicazioni di quest’albero, c’è che
(x + y )n =
cn 0 · x n · y 0 + cn 1 · x n−1 · y 1 + cn 2 · x n−2 · y 2 + · · · + cn n · x 0 · y n
Eugenio Omodeo
Università degli Studi di Trieste.
Programmazione ( Aggregati, al di là delle stringhe. Primi esem
Scaletta
Gli aggregati ci servono ?
Possiamo farne a meno ?
Triangolo di Tartaglia ( o di Pascal ) -II
In Wikipedia trovate:
“In about 1150, the Hindu mathematician
Bhaskaracharya gave a very clear exposition of binomial
coefficients in his book Lilavati.”
Eugenio Omodeo
Università degli Studi di Trieste.
Programmazione ( Aggregati, al di là delle stringhe. Primi esem
Scaletta
Gli aggregati ci servono ?
Possiamo farne a meno ?
Triangolo di Tartaglia ( o di Pascal ) -III
In Wikipedia trovate anche:
One has a recursive formula for binomial coefficients
n
n−1
n−1
=
+
k
k −1
k
for all integers n, k > 0 , with initial values
n
= 1
for all integers n > 0 ,
0
0
= 0
for all integers k > 0 .
k
Eugenio Omodeo
Università degli Studi di Trieste.
Programmazione ( Aggregati, al di là delle stringhe. Primi esem
Scaletta
Gli aggregati ci servono ?
Possiamo farne a meno ?
Triangolo di Tartaglia ( o di Pascal ) -IV
Dunque, il calcolo dei coefficienti binomiali si può
implementare—ricorsivamente—cosı́ :
public static int coeffBin( int n, int k ){
assert ( 0 <= k && k <= n ) || n == 0 ;
if ( k == 0 ) return 1;
if ( n == 0 ) return 0;
return coeffBin( n - 1, k - 1 ) + coeffBin( n - 1, k );
}
Qui i parametri formali n e k rappresentano indice di riga e di
colonna nel triangolo di Tartaglia.
Eugenio Omodeo
Università degli Studi di Trieste.
Programmazione ( Aggregati, al di là delle stringhe. Primi esem
Scaletta
Gli aggregati ci servono ?
Possiamo farne a meno ?
Idea: Ricorsione invece degli aggregati ?
Esercitazione in aula: Un metodo che raccolga da tastiera una
sequenza di parole per riesporle tutte assieme alla fine.
Eugenio Omodeo
Università degli Studi di Trieste.
Programmazione ( Aggregati, al di là delle stringhe. Primi esem
Scaletta
Gli aggregati ci servono ?
Possiamo farne a meno ?
Eco di una sequenza di parole –I
public static void eco sequenza() { // es. di metodo *ricorsivo*
// ( in effetti invoca se stesso)
String s; // qui si dichiara che l’entita‘ da leggere e‘ una stringa
s = leggi parola( ); // qui si legge s da tastiera
if ( ! s.toLowerCase( ).equals(”ciao”) ) eco sequenza( );
System.out.println( s );
// DOMANDA: in che ordine verranno echeggiate le parole?
}
Eugenio Omodeo
Università degli Studi di Trieste.
Programmazione ( Aggregati, al di là delle stringhe. Primi esem
Scaletta
Gli aggregati ci servono ?
Possiamo farne a meno ?
Eco di una sequenza di parole –II
private static String leggi parola( ) {
return tastiera.next( );
// DOMANDA: dove va dichiarato il tipo della tastiera?
}
La risposta è nel prossimo lucido, che mostra come assemblare i
vari pezzi.
Eugenio Omodeo
Università degli Studi di Trieste.
Programmazione ( Aggregati, al di là delle stringhe. Primi esem
Scaletta
Gli aggregati ci servono ?
Possiamo farne a meno ?
Eco di una sequenza di parole –III
public static class EcoDiSequenza {
public static void main · · ·
··· ··· ···
public static void eco sequenza · · ·
··· ··· ···
private static String leggi parola · · ·
··· ··· ···
private static Scanner tastiera = new Scanner( System.in );
// qui si crea l’oggetto tastiera
}
Eugenio Omodeo
Università degli Studi di Trieste.
Programmazione ( Aggregati, al di là delle stringhe. Primi esem
Scaletta
Gli aggregati ci servono ?
Possiamo farne a meno ?
Possiamo valutare un polinomio senza prima ‘aggregarlo’ ?
Esercitazione in aula: Regola di Horner per la valutazione di un
polinomio.
Il criterio è: Per valutare in corrispondenza a una x nota il
polinomio
an · x n + an−1 · x n−1 + · · · + a1 · x + a0
( fornito per monomi digradanti ), procedere nell’ordine che
assicura il minor numero di moltiplicazioni:
(· · ·(((an · x + an−1 ) · x + an−2 ) · x + an−3 )· · · + a1 ) · x + a0 )
Eugenio Omodeo
Università degli Studi di Trieste.
Programmazione ( Aggregati, al di là delle stringhe. Primi esem
Scaletta
Gli aggregati ci servono ?
Possiamo farne a meno ?
Valutazione alla Horner di un polinomio –I
public static int valore polinomio( int valSinora,
int valDellaX ) {
int c; // qui si dichiara che il coefficiente da leggere e‘ un intero
c = prossimo coeff( ); // lo si acquisisce da tastiera ?
if ( ! estUltimo( ) )
return valore polinomio( valSinora * valDellaX + c,
valDellaX );
return valSinora * valDellaX + c;
}
Eugenio Omodeo
Università degli Studi di Trieste.
Programmazione ( Aggregati, al di là delle stringhe. Primi esem
Scaletta
Gli aggregati ci servono ?
Possiamo farne a meno ?
Valutazione alla Horner di un polinomio –II
Per eleganza, dovremmo rendere private il precedente metodo
valore polinomio
e farne il ‘cavallo da tiro’ di un metodo che dia avvio alla ricorsione:
public static int valore polinomio( int valDellaX ) {
return valore polinomio( 0, valDellaX ) ;
}
private static int valore polinomio( int valSinora,
int valDellaX ) {
..
.
Eugenio Omodeo
..
.
Università degli Studi di Trieste.
Programmazione ( Aggregati, al di là delle stringhe. Primi esem
Scaletta
Gli aggregati ci servono ?
Possiamo farne a meno ?
Valutazione alla Horner di un polinomio –III
Abbiamo riprodotto lo stesso schema di controllo che ci era servito
per l’eco di una sequenza di parole, ma in questo caso la ricorsione
è un lusso: potevamo farne a meno e implementare lo stesso
algoritmo tramite una while.
Morale: non sempre la ricorsione è la chiave magica che serve; per
lo piú l’iterazione ( ossia l’impiego di istruzioni quali la while, la
do, la for ) ci permette di fare altrettanto con piú parsimonia di
mezzi. In certe situazioni, peraltro, è invece la ricorsione a farci
risparmiare, esentandoci dalla gestione di qualche aggregato in
memoria.
Eugenio Omodeo
Università degli Studi di Trieste.
Programmazione ( Aggregati, al di là delle stringhe. Primi esem
Scaletta
Gli aggregati ci servono ?
Possiamo farne a meno ?
Dopotutto: Cantor non codificava le coppie come singoli ?
Esercitazione in aula: Composizione e scomposizione di coppie di
numeri naturali.
Eugenio Omodeo
Università degli Studi di Trieste.
Programmazione ( Aggregati, al di là delle stringhe. Primi esem