DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE La Ricorsione Marco D. Santambrogio – [email protected] Ver. aggiornata al 21 Maggio 2014 Obiettivi DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • La ricorsione Ricordate la sigla GNU GNU = GNU is Not Unix GNU = GNU is Not Unix GNU = GNU is Not Unix GNU = GNU is Not GNU = GNU 2 La ricorsione: che cos’è? DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Ricorsione indiretta: Un sottoprogramma P chiama un sottoprogramma Q Q a sua volta chiama un terzo R, … R chiama nuovamente P • Ricorsione diretta Un sottoprogramma P chiama se stesso durante la propria esecuzione 3 Un esempio classico DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Individuare, in un gruppo di palline l’unica pallina di peso maggiore delle altre facendo uso di una bilancia “a basculla” • Per semplicità: il numero di palline sia una potenza di 3 • Algoritmo Pesate: • Se il gruppo di palline consiste in una sola pallina, allora essa è banalmente la pallina cercata, altrimenti procedi come segue. – Dividi il gruppo di palline in tre e confronta due dei tre sottogruppi. – Se i due gruppi risultano di peso uguale scarta entrambi, altrimenti scarta il gruppo non pesato e quello risultato di peso minore. – Applica l’algoritmo Pesate al gruppo rimanente. 4 Altri esempi di ricorsione DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • La sommatoria di una sequenza di numeri • Fattoriale: Fact(n)=n*Fact(n-1) Fact(0)=1 • In arte e non solo… 5 Scopo della programmazione ricorsiva DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Lo scopo è quelo di risolvere un problema facendo riferimento allo stesso problma su scala ridotta • La condizione di terminazione avviene quando si identifica uno o più casi semplici con soluzione immediata • La struttura di un algoritmo ricorsivo è il seguente if (è il caso semplice) risolvilo else usa la ricorsione su dati ridotti 6 Il calcolo del fattoriale DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE In matematica, se n è un intero positivo, si definisce n fattoriale e si indica con n! il prodotto dei primi n numeri interi positivi minori o uguali di quel numero 7 Il main del fattoriale DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 8 Il fattoriale iterativo DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 9 La ricorsione come strumento di programmazione DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Calcolo del Fattoriale in modo ricorsivo: Fact(n)=n*Fact(n-1) Fact(0)=1 fat= 1 FattRic(0) fat= 1 FattRic(1) fat= 2 FattRic(2) fat= 6 FattRic(3) n=3 main 10 Moltiplicazione DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Ideare un procedimento ricorsivo per calcolare il prodotto di due interi • Nota: A*1=A; A*B = A + A*(B-1) int MulRic(int a, int b) { int ris; if (b == 1) ris = a; else ris = a + MulRic(a ,b–1); return ris; } 11 Successione di Fibonacci DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE “Quante coppie di conigli si ottengono dopo N mesi (salvo i casi di morte) supponendo che ogni coppia dia alla luce un‘altra coppia ogni mese e che le coppie più giovani siano in grado di riprodursi già al secondo mese di vita?” 12 Successione di Fibonacci DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Fib(n)=Fib(n-1)+Fib(n-2) • Fib(0)=0; Fib(1)=1; int fibRic (int n) { int ris; if (n == 0) ris = 0; else if (n == 1) ris = 1; else ris = fibRic(n–1) + fibRic(n–2); return ris; } 13 Un problema interessante: La torre di Brahma DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 14 La leggenda DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Narra la leggenda che all'inizio dei tempi, Brahma portò nel grande tempio di Benares, sotto la cupola d'oro che si trova al centro del mondo, tre colonnine di diamante e sessantaquattro dischi d'oro, collocati su una di queste colonnine in ordine decrescente, dal più piccolo in alto, al più grande in basso. • E' la sacra Torre di Brahma che vede impegnati, giorno e notte, i sacerdoti del tempio nel trasferimento della torre di dischi dalla prima alla terza colonnina. • Essi non devono contravvenire alle regole precise, imposte da Brahma stesso, che richiedono di spostare soltanto un disco alla volta e che non ci sia mai un disco sopra uno più piccolo. • Quando i sacerdoti avranno completato il loro lavoro e tutti i dischi saranno riordinati sulla terza colonnina, la torre e il tempio crolleranno e sarà la fine del mondo. 15 Il gioco DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE 16 L’idea DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Se voglio spostare n anelli dal piolo sorgente, a quello destinazione, usando come appoggio il piolo ausiliario, devo prima spostare n - 1 anelli dal sorgente all'ausiliario, usando come appoggio il piolo destinazione; poi sposto l'unico anello rimasto dal sorgente al piolo destinazione; infine sposto gli n - 1 anelli che si trovano sull'ausilliario all'anello destinazione. • Quando si spostano gli n - 1 anelli la funzione hanoi richiama se stessa, cioè effettua una chiamata ricorsiva, semplificando però il problema perché bisogna spostare un numero di anelli inferiore. • In pratica, con la ricorsione il problema viene continuamente ridotto di complessità fino alla soluzione banale in cui rimane solo un anello, che viene semplicemente spostato nel piolo destinazione. 17 Codice DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE void hanoi(int n, int sorgente, int destinazione, int aux) { if (n==1) printf("Sposto da %d a %d.\n",sorgente, destinazione); else{ hanoi(n - 1, sorgente, aux, destinazione); hanoi(1, sorgente, destinazione, aux); hanoi(n - 1, aux, destinazione, sorgente); } } 18 Esercizio: Massimo di un array DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Ideare un procedimento ricorsivo per calcolare il massimo di un array di interi • Idea: max(vect[0 : N]) =max(vect[0],max(vect[1 : N])) int max(int *array, int n){ int maxs; if (n==1) return array[0]; /*Caso Array 1 elemento*/ if (n==2){ /*Caso Base*/ if (array[0]>array[1]) return array[0]; else return array[1]; } maxs = max(&array[1],n-1); /*Risolvi Problema Ridotto*/ if (array[0]>maxs)return array[0]; else return maxs; } 19 Fonti per lo studio + Credits DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE • Fonti per lo studio Introduzione alla programmazione in MATLAB, A.Campi, E.Di Nitto, D.Loiacono, A.Morzenti, P.Spoletini, Ed.Esculapio • Capitolo 4 – Particolare attenzione al 4.5 • Credits Prof. A. Morzenti Gianluca Palermo 20