Corso di Fondamenti di Informatica Macroarea di Ingegneria 2018/19 Tutor: prof. Francesco De Vincenzi
MATLAB: esercizio Dati un vettore e una matrice di dimensioni qualsiasi, trovare le coordinate (riga e colonna) del punto in cui il vettore si trova all’interno della matrice. 2 1 2 3 4 5 7 7 3 4 3
MATLAB: esercizio Suddivido il problema in sottoproblemi Verificare se due vettori sono uguali Cercare la posizione di un vettore in un vettore più grande Cercare la posizione di un vettore in una riga di una matrice = 7 3 4 ? 7 3 4 7 3 4 2 5 7 3 4 8 1 6 4 2 3 9 5 7 8 7 3 4
MATLAB: esercizio Oppure… function uguali = confrontaVettori(A1,A2) lung1=length(A1); lung2=length(A2); if(lung1~=lung2) uguali=false; else uguali=true; for i=1:1:lung1 if A1(i)~=A2(i) end Oppure… function uguali = confrontaVettori2(A1,A2) uguali=length(A1)==length(A2) && min(A1==A2); end
MATLAB: esercizio function pos = cercaSottoVettore(A1,A2) %A1 vettore da cercare [3 4 5] %A2 vettore in cui cercare [1 2 3 4 5 6 7 8 9] lung1=length(A1); lung2=length(A2); if(lung1>lung2) pos=0; % 0 posizione non valida, la uso per else % indicare che il vettore non c’è pos=0; for i=1:lung2-lung1+1 if confrontaVettori(A1,A2(i:i+lung1-1)) pos=i; break; end
MATLAB: esercizio function [riga,colonna] = posVettoreInMatrice(V,M) dimensioni=size(M); for i=1:dimensioni(1) posVettore= cercaSottoVettore(V,M(i,:)); if posVettore>0 riga=i; colonna=posVettore; break; end
MATLAB: esercizio Dato un vettore, cercare la posizione dell’elemento minimo 7 3 2 4 1 5 6 La posizione è la 6 function p = posMinimo( V) minimo=intmax('int64'); for i=1:length(V) if V(i)<minimo minimo=V(i); p=i; end
MATLAB: esercizio Se n=2 Se n=3 7 3 2 4 1 5 6 7 3 2 4 1 5 6 Dato un vettore V e un numero n, cercare la posizione del sottovettore di V lungo n la cui somma degli elementi sia minima. Esempio: Se n=2 7 3 2 4 1 5 6 La posizione è la 5. Infatti 3+1 dà somma 4 Se n=3 7 3 2 4 1 5 6 La posizione è la 4. Infatti 4+3+1 dà somma 8
MATLAB: esercizio Suddivido il problema in sottoproblemi Prelevare da un vettore un sottovettore di lunghezza generica n Applicare la somma a tutti i sottovettori di lunghezza n, trovando la posizione di quello che dà somma più piccola n=3 2 5 7 3 4 7 3 4 14 15 2 5 7 3 4 14 9
MATLAB: esercizio function s = sottoVettore(V,inizio,lung) s=V(inizio:inizio+lung-1); end function sm = sottoVettoreMinimo( V, n) lung=length(V); minimo= intmax('int64'); %massimo valore possibile per un int64 for i=1:lung-n+1 sommaSottovettore=sum(sottoVettore(V,i,n)); if sommaSottovettore<minimo minimo=sommaSottovettore; sm=i; end
MATLAB: esercizio Se n=2 2 5 7 3 4 1 6 8 Data una matrice M e un numero n, trovare la posizione (elemento in alto a sinistra) della sottomatrice nxn con la somma minima. Se n=2 2 5 7 3 4 1 6 8 La posizione è (2,2) e contiene la somma 8 che è la più bassa possibile.
MATLAB: esercizio Costruisco due funzioni “di servizio”: La prima mi estrae da una matrice una sottomatrice quadrata di lato n in posizione (i,j) La seconda produce la somma di tutti gli elementi di una matrice function s = sottoMatrice(M,i,j,n) s=M(i:i+n-1,j:j+n-1); end function s = sommaElementiMatrice(M) s=sum(sum(M)); end
MATLAB: esercizio function [riga,colonna] = posSottomatriceMinima(M,n) minimo=intmax('int64'); dimensioni=size(M); for i=1:dimensioni(1)-n+1 for j=1:dimensioni(2)-n+1 sommaSottomatrice=sommaElementiMatrice(sottoMatrice(M,i,j,n)); if sommaSottomatrice<minimo minimo=sommaSottomatrice; riga=i; colonna=j; end
Una funzione che richiama se stessa!? MATLAB: La ricorsione function s = funzione(…) … funzione(…) end Una funzione che richiama se stessa!?
MATLAB: La ricorsione La ricorsione è una tecnica di scrittura di funzioni. Si può applicare quando l’insieme dei valori su cui è applicabile la funzione (dominio) gode di due proprietà: L’insieme è ordinato (si può sempre dire se un elemento è o non è più piccolo di un altro) Esiste un elemento più piccolo di tutti (elemento “base”)
MATLAB: La ricorsione Esempio del DOMINO . . . . . . Primo elemento di un insieme ordinato. È il caso “base”, per il quale bisogna avere un trattamento particolare. Elemento generico di un insieme ordinato. Il suo comportamento dipende dal comportamento dell’elemento precedente
MATLAB: La ricorsione 0 1 2 3 4 5 6 7 8 9 10 11 12 13 … Possiamo applicare la ricorsione a: L’insieme dei numeri naturali 0 1 2 3 4 5 6 7 8 9 10 11 12 13 … 2) L’insieme degli elementi di un vettore 1 2 3 4 5 6 7 8 9 10 …
Funzione che calcola il doppio di un numero naturale (>=0) MATLAB: Esempio Funzione che calcola il doppio di un numero naturale (>=0) 0 1 2 3 4 5 6 7 8 9 10 11 12 13 … Il doppio di un qualsiasi numero è il doppio del precedente aumentato di 2 Il doppio di 0 è 0.
MATLAB: Esempio function d = doppio(n) Esempio di chiamata: if n==0 disp("caso base"); d=0; else disp(n); d=doppio(n-1)+2; end Esempio di chiamata: doppio(5)= doppio(4)+2= doppio(3)+2+2 doppio(2)+2+2+2= doppio(1)+2+2+2+2= doppio(0)+2+2+2+2+2= 0+2+2+2+2+2=10
Funzione che verifica se un numero è pari MATLAB: Esempio Funzione che verifica se un numero è pari 0 1 2 3 4 5 6 7 8 9 10 11 12 13 … Un numero è pari se il precedente è dispari e viceversa. 0 è pari.
MATLAB: Esempio function p = pari(n) Esempio di chiamata: if n==0 p=true; else p=not(pari(n-1)); end Esempio di chiamata: pari(5)= not(pari(4))= not(not(pari(3)))= not(not(not(pari(2))))= not(not(not(not(pari(1)))))= not(not(not(not(not(pari(0))))))= not(not(not(not(not(true)))))= not(not(not(not(false))))= not(not(not(true)))= not(not(false))= not(true)= false
function risultato = prodottoRicorsivo (a, b) if(a==1) risultato=b; else risultato=b+prodottoRicorsivo(a-1,b); end
%Calcolare a elevato a b %con b>=0 function p = potenzaRicorsiva (a, b) if(b==0) p=1; else p=a*potenzaRicorsiva(a,b-1); end
%Funzione per calcolare il numero di divisori di un numero %Esempio di chiamata: divisoriRicorsiva (n, m) function d = divisoriRicorsiva (n, m) if m==1 d=1; else if mod(n,m)==0 d=1+divisoriRicorsiva(n,m-1); d=divisoriRicorsiva(n,m-1); end
Calcolare la somma degli elementi di un vettore MATLAB: Esempio Calcolare la somma degli elementi di un vettore 1 2 3 4 5 6 7 8 9 10 … La somma degli elementi di un vettore vuoto è 0. sommaV( ) = 0 2) La somma degli elementi di un vettore qualsiasi è la somma tra l’ultimo valore e la somma degli elementi del vettore ottenuto togliendo l’ultimo valore sommaV( ) = a b c d sommaV( ) + d a b c
+sommaV( ) = 4+2+3+1+ sommaV( )= MATLAB: Esempio function s = sommaV(V) lung=length(V); if(lung==0) s=0; else s=V(lung)+sommaV(V(1:lung-1)); end sommaV( ) = 1 3 2 4 1 3 2 4+sommaV( ) = 1 4+2+sommaV( ) = 4+2+3 1 3 +sommaV( ) = 4+2+3+1+ sommaV( )= 4+2+3+1+0=10
Contare il numero di occorrenze di un valore x in un vettore V MATLAB: Esempio Contare il numero di occorrenze di un valore x in un vettore V Il numero di occorrenze di un valore in un vettore vuoto è 0 2) In un vettore non vuoto confronto x col primo elemento e rilancio la ricerca sul resto del vettore x 0/1+ il numero di occorrenze di x nel resto del vettore 1 2 3 4 5 6 7 8 9 10
MATLAB: Esempio function n = contaOccorrenze(x, V) lung=length(V); if lung==0 n=0; else if V(1)==x n=1+contaOccorrenze (x,V(2:lung)); n=contaOccorrenze (x,V(2:lung)); end caso base caso ricorsivo
MATLAB: Esempio Dato un valore x ed un vettore V, produrre il vettore con i soli elementi di V maggiori di x Se il vettore è vuoto, il vettore risultato è vuoto 2) In un vettore non vuoto confronto x col primo elemento e rilancio la ricerca sul resto del vettore x Scarto l’elemento in prima posizione o lo concateno col risultato della funzione eseguita sul resto del vettore 1 2 3 4 5 6 7 8 9 10
MATLAB: Esempio caso base caso ricorsivo function R = maggiori (x, V) lung=length(V); if(lung==0) R=[]; else if(V(1)>x) R=[V(1) maggiori(x,V(2:lung))]; R=maggiori(x,V(2:lung)); end caso base caso ricorsivo
MATLAB: Ricorsione e matrici E’ possibile applicare la ricorsione anche a matrici, a patto di definire un ordinamento delle sue posizioni. 1 4 2 3 1,1 1,2 1,3 1,4 2,1 Sfruttando l’indice unico che in una matrice enumera gli elementi da sinistra a destra, dall’alto in basso Sfruttando il doppio indice riga/colonna
MATLAB: Ricorsione e matrici Sommare gli elementi di una matrice function somma = sommaMatriceRicorsiva (pos,M) dimensioni=size(M); numeroElementi=dimensioni(1)*dimensioni(2); if(pos>numeroElementi) somma=0; else somma=M(pos)+sommaMatriceRicorsiva(pos+1,M); end Viene fornito l’indice di partenza Chiamata: sommaMatriceRicorsiva(1,MAT)
MATLAB: Ricorsione e matrici function somma = sommaMatriceRicorsiva1 (r, c, M) dimensioni=size(M); if(r==dimensioni(1) & c==dimensioni(2)) somma=M(r,c); else r1=r; c1=c+1; if(c1>dimensioni(2)) c1=1; r1=r1+1; end somma=M(r,c)+sommaMatriceRicorsiva1(r1,c1,M); Vengono forniti gli indici di partenza Chiamata: sommaMatriceRicorsiva1(1,1,MAT)
MATLAB: Esercizi Scrivi una funzione ricorsiva che prende in input un numero intero non negativo n e calcola il suo quadrato n2 (sugg. n2 =n+n+….+n ) Scrivi una funzione ricorsiva che prende in input un numero intero non negativo n e calcola il suo fattoriale (il prodotto 1*2*3*…*n) Scrivi una funzione ricorsiva che prende in input un numero intero non negativo n e calcola la potenza 2n (sugg. n2 =2*2*….*2 ) Scrivi una funzione ricorsiva che prende in input un vettore V e calcola il prodotto dei suoi elementi Scrivi una funzione ricorsiva che prende in input un vettore V e conta quanti zeri ci sono Scrivi una funzione ricorsiva che prende in input un vettore V e trova il suo valore minimo Scrivi una funzione ricorsiva che prende in input due vettori e produce un valore booleano true se sono uguali(stessi valori nelle stesse posizioni) o false