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