La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Corso di Fondamenti di Informatica

Presentazioni simili


Presentazione sul tema: "Corso di Fondamenti di Informatica"— Transcript della presentazione:

1 Corso di Fondamenti di Informatica
Macroarea di Ingegneria 2018/19 Tutor: prof. Francesco De Vincenzi

2 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

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

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

5 MATLAB: esercizio function pos = cercaSottoVettore(A1,A2)
%A1 vettore da cercare [3 4 5] %A2 vettore in cui cercare [ ] 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

6 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

7 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

8 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 dà somma 8

9 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

10 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

11 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.

12 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

13 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

14 Una funzione che richiama se stessa!?
MATLAB: La ricorsione function s = funzione(…) funzione(…) end Una funzione che richiama se stessa!?

15 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”)

16 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

17 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 2) L’insieme degli elementi di un vettore 1 2 3 4 5 6 7 8 9 10

18 Funzione che calcola il doppio di un numero naturale (>=0)
MATLAB: Esempio Funzione che calcola il doppio di un numero naturale (>=0) Il doppio di un qualsiasi numero è il doppio del precedente aumentato di 2 Il doppio di 0 è 0.

19 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) = doppio(0) = =10

20 Funzione che verifica se un numero è pari
MATLAB: Esempio Funzione che verifica se un numero è pari Un numero è pari se il precedente è dispari e viceversa. 0 è pari.

21 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

22 function risultato = prodottoRicorsivo (a, b)
if(a==1) risultato=b; else risultato=b+prodottoRicorsivo(a-1,b); end

23 %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

24 %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

25 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

26 +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( ) = sommaV( )= =10

27 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

28 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

29 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

30 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

31 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

32 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)

33 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)

34 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


Scaricare ppt "Corso di Fondamenti di Informatica"

Presentazioni simili


Annunci Google