Post on 03-May-2015
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
Lab 7 – Info B Lab 7 – Info B
Marco D. Santambrogio – marco.santambrogio@polimi.itRiccardo Cattaneo – rcattaneo@elet.polimi.it
Ver. aggiornata al 6 Gennaio 2014
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
Calendario dei LabCalendario dei Lab
• 14 Gennaio 2014, 10am-12.45pm, @ LM1 MATLAB: funzioni ricorsive
• 21 Gennaio 2014, 10am-12.45pm, @ LM1 MATLAB: funzioni ricorsive, funzioni di
ordine superiore, grafici 2D e 3D
2
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
Lab 7: AgendaLab 7: Agenda
• Warm Up (30’)
• Qualche cosa un po’ più divertente (60’)
• Altri exe (90’)
3
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
Lab 7: Ora..Lab 7: Ora..
• Warm Up (30’) shiftSinistro
• Qualche cosa un po’ più divertente (60’)
• Altri exe (90’)
4
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
shiftSinistro: problemashiftSinistro: problema
• Dato un vettore riga v rappresentante un numero in codifica binaria Si effettui lo shift a sinistra (cioè si
spostino a sinistra i singoli bit) fino a che non si incontra il primo 1
Es: v=[0 0 1 0 1 0 1 1] -> [1 0 1 0 1 1 0 0]
5
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
shiftSinistroshiftSinistro
function [ris] = shiftSx(n) if ~isvector(n) | any (n < 0 | n > 1) ris = NaN;elseif n(1) == 1 ris = n;else ris = shiftSx([n(2:length(n)) n(1)]);end
6
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
Lab 7: Lab 7: OOra..ra..
• Warm Up (30’)
• Qualche cosa un po’ più divertente (60’) numeroPrimo serie (normale)
• Altri exe.. (90’)
7
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
numeroPrimo: problemanumeroPrimo: problema
• Dato un numero intero positivo inserito dall’utente, dire se tale numero è primo (stampa a video 1 se primo, 0 altrimenti) Un numero è primo se è divisibile solo
per 1 e se stesso Esempio• >>> 7 ---> >>>1• >>> 9 ---> >>>0
8
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
numeroPrimo iterativanumeroPrimo iterativa
function [ris] = numPrimo2(x) ris=1;for y=2:sqrt(x) ris = ris*(~(~rem(x,y)));end
9
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
numeroPrimo RicorsivanumeroPrimo Ricorsiva
function [ris] = numPrimo(x,y) if y>sqrt(x) ris = 1else ris =
(~(~rem(x,y)))*numPrimo(x,y+1);end
10
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
serie (normale): problemaserie (normale): problema
Si consideri la successione definita dalla seguente relazione:
x(1) = 0x(2) = 1x(n) = 2 * x(n-1) + 3 * x(n-2)
Si scriva una funzione succ(n) che calcoli il valoren-esimo della successione.
11
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
serie (normale): soluzioneserie (normale): soluzione
function res = succ(n) res = [0 1]if (n>2):
for i = 3:1:nres = [res 2*res(i-1) + 3*res(i-2)];
endelse if n==2
res = 1else n ==1
res = 0
12
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
Lab 7: Lab 7: OOrara……
• Warm Up (30’)• Qualche cosa un po’ più divertente
(60’)
• Altri exe… (90’) sottoMatrici serie (ricorsione)
13
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
sottoMatrici: problemasottoMatrici: problema
Creare una matrice di dimensione n*n che nel suo centro contiene un quadrato 2x2 che contenente il valore 1 e, andando verso l'esterno, i valori 2, 3, .. fino a n/2 nella cornice più esterna
Es.:
14
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
sottoMatrici: soluzione1sottoMatrici: soluzione1
function [M] = sottoMatr(n) if(n == 1) M = ones(2,2);else M = sottoMatr(n-1) r = ones(1, size(M, 2)) * n M = [r; M ; r] c = ones(size(M, 1), 1) * n M = [c M c]end
15
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
sottoMatrici: soluzione2sottoMatrici: soluzione2
function [matrRis]=sottoMatr(n)
if n==1 matrRis=ones(2);else matrRis=n*ones(2*n); matrRis(2:2*n-1,2:2*n-1)=sottoMatr(n-1);end
16
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
serie (ricorsione): serie (ricorsione): problemaproblema
Si consideri la successione definita dalla seguente relazione ricorsiva:
x(1) = 0x(2) = 1x(n) = 2 * x(n-1) + 3 * x(n-2)
Si scriva una funzione ricorsiva succRic(n) che calcoli il valoren-esimo della successione.
17
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
serie (ricorsione): serie (ricorsione): soluzionesoluzionefunction res = succRic(n)if n==1
% Primo caso baseres = 0;
elseif n==2% Secondo caso baseres = 1;
else% Passo ricorsivores = 2*succRic(n-1) + 3*succRic(n-2);
end
18
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
Fonti per lo studio + Fonti per lo studio + CreditsCredits• Fonti per lo studio
Introduzione alla programmazione in MATLAB, A.Campi, E.Di Nitto, D.Loiacono, A.Morzenti, P.Spoletini, Ed.Esculapio• Capitolo 2, 4, 5
• Credits: Prof. Paolo Garza (per l’esercizio
sottoMatrici) Emanuele Panigati https://sites.google.com/site/engpanigati/
19