introduzione alla programmazione in matlab: parte 3 (la...
TRANSCRIPT
FondamentidiInformaticaIntroduz ionea l la programmazione in MATLAB: Parte 3 (La R icors ione eDebugging)
Prof. Chr i st ian Espos i to
Corso d i Laurea in Ingegner ia Meccanica e Gest iona le (C lasse I )
A .A . 2016/17
IntroduzioneallaprogrammazioneinMATLAB:Parte3
◦Principibase◦ CasoStudio1:Fattoriale◦ CasoStudio2:Fibonacci
◦ DebuggingdeiProgrammiMATLAB
IntroduzioneallaprogrammazioneinMATLAB:Parte3
IntroduzioneallaprogrammazioneinMATLAB:Parte3
OUTLINE
02/61
Ilconcettodiricorsione ininformaticasiriconduceaquellodiinduzionematematica.
Sia P un predicato sull’insieme N dei numerinaturali e sia vero il predicato P(0); se per ogni Kintero, dal predicato P(k) discende la verità diP(k+1) allora P(n) è vero per qualsiasi n.
Principibase(1)
IntroduzioneallaprogrammazioneinMATLAB:Parte3 03/61
Principibase(2)
IntroduzioneallaprogrammazioneinMATLAB:Parte3
La dimostrazione induttiva avviene in due passi:o Passo base : dimostrare P(0)=vero;o Passo induttivo: dimostrare che per ogni
k>0, si ha cheP(k) P(k+1)
Così come nel principio di induzione la verità diP(k+1) discende dalla verità dello stesso predicatoP(k), il calcolo di un funzione ricorsiva avvienemediante il calcolo della stessa funzione in unpasso successivo.
04/61
CasoStudio:Fattoriale(1)◦ Ilfattorialediunintero(positivo)n,indicatoconn!,èilprodottodituttigliinteripositiviminoriougualidin (sinotiche0!=1)
IntroduzioneallaprogrammazioneinMATLAB:Parte3 05/61
CasoStudio:Fattoriale(1)◦ Ilfattorialediunintero(positivo)n,indicatoconn!,èilprodottodituttigliinteripositiviminoriougualidin(sinotiche0!=1)
𝑛! = %𝑖'
()*
IntroduzioneallaprogrammazioneinMATLAB:Parte3 06/61
CasoStudio:Fattoriale(1)◦ Ilfattorialediunintero(positivo)n,indicatoconn!,èilprodottodituttigliinteripositiviminoriougualidin (sinotiche0!=1)
𝑛! = %𝑖'
()*
= 1 ∗ 2 ∗ 3 ∗ …∗ 𝑛 − 1 ∗ 𝑛
IntroduzioneallaprogrammazioneinMATLAB:Parte3 07/61
CasoStudio:Fattoriale(1)◦ Ilfattorialediunintero(positivo)n,indicatoconn!,èilprodottodituttigliinteripositiviminoriougualidin (sinotiche0!=1)
𝑛! = %𝑖'
()*
= 1 ∗ 2 ∗ 3 ∗ …∗ 𝑛 − 1 ∗ 𝑛
%𝑖'12
()*
IntroduzioneallaprogrammazioneinMATLAB:Parte3 08/61
CasoStudio:Fattoriale(1)◦ Ilfattorialediunintero(positivo)n,indicatoconn!,èilprodottodituttigliinteripositiviminoriougualidin (sinotiche0!=1)
𝑛! = %𝑖'
()*
= 1 ∗ 2 ∗ 3 ∗ …∗ 𝑛 − 1 ∗ 𝑛
%𝑖'12
()*
𝑛 − 1 !
IntroduzioneallaprogrammazioneinMATLAB:Parte3 09/61
CasoStudio:Fattoriale(1)◦ Ilfattorialediunintero(positivo)n,indicatoconn!,èilprodottodituttigliinteripositiviminoriougualidin (sinotiche0!=1)
◦Definizionericorsiva(parziale):
𝑛! = 𝑛 − 1 ! ∗ 𝑛
IntroduzioneallaprogrammazioneinMATLAB:Parte3 10/61
CasoStudio:Fattoriale(2)◦Definizionericorsiva:
𝑛! = 3 1, 𝑠𝑒𝑛 = 0 𝑛 − 1 ! ∗ 𝑛, 𝑠𝑒𝑛 > 0
IntroduzioneallaprogrammazioneinMATLAB:Parte3 11/61
CasoStudio:Fattoriale(2)◦Definizionericorsiva:
𝑛! = 3 1, 𝑠𝑒𝑛 = 0 𝑛 − 1 ! ∗ 𝑛, 𝑠𝑒𝑛 > 0
Casobase
IntroduzioneallaprogrammazioneinMATLAB:Parte3 12/61
CasoStudio:Fattoriale(2)◦Definizionericorsiva:
𝑛! = 3 1, 𝑠𝑒𝑛 = 0 𝑛 − 1 ! ∗ 𝑛, 𝑠𝑒𝑛 > 0
Casobase
Ilcasobaseènecessarioaffinchélaricorsione terminiinvecediavereuna
«ricorsione infinita»
IntroduzioneallaprogrammazioneinMATLAB:Parte3 13/61
CasoStudio:Fattoriale(2)◦Definizionericorsiva:
𝑛! = 3 1, 𝑠𝑒𝑛 = 0 𝑛 − 1 ! ∗ 𝑛, 𝑠𝑒𝑛 > 0
Casobase
Ilcasobaseènecessarioaffinchélaricorsione terminiinvecediavereuna
«ricorsione infinita»
Nelnostroesempio,sen èugualea0,alloralafunzionerestituirà1(datoche0!=1)
IntroduzioneallaprogrammazioneinMATLAB:Parte3 14/61
CasoStudio:Fattoriale(2)◦Definizionericorsiva:
𝑛! = 3 1, 𝑠𝑒𝑛 = 0 𝑛 − 1 ! ∗ 𝑛, 𝑠𝑒𝑛 > 0
Versionepiùsemplicedelladefinizione
IntroduzioneallaprogrammazioneinMATLAB:Parte3 15/61
CasoStudio:Fattoriale(3)◦ CodiceMATLAB
𝑛! = 3 1, 𝑠𝑒𝑛 = 0 𝑛 − 1 ! ∗ 𝑛, 𝑠𝑒𝑛 > 0
function [n_fact] = fattoriale_ricorsivo(n)if n == 0
n_fact = 1;else
n_fact = fattoriale_ricorsivo(n - 1) * n; end
end
IntroduzioneallaprogrammazioneinMATLAB:Parte3 16/61
CasoStudio:Fattoriale(3)◦ CodiceMATLAB
𝑛! = 3 1, 𝑠𝑒𝑛 = 0 𝑛 − 1 ! ∗ 𝑛, 𝑠𝑒𝑛 > 0
function [n_fact] = fattoriale_ricorsivo(n)if n == 0
n_fact = 1;else
n_fact = fattoriale_ricorsivo(n - 1) * n; end
end
Invocazionericorsiva
IntroduzioneallaprogrammazioneinMATLAB:Parte3 17/61
CasoStudio:Fattoriale(4)◦ Dietrolequinte...
fattoriale_ricorsivo(4)
IntroduzioneallaprogrammazioneinMATLAB:Parte3 18/61
CasoStudio:Fattoriale(4)◦ Dietrolequinte...
fattoriale_ricorsivo(4)
IntroduzioneallaprogrammazioneinMATLAB:Parte3 19/61
CasoStudio:Fattoriale(4)◦ Dietrolequinte...
fattoriale_ricorsivo(4)
4 * fattoriale_ricorsivo(3)
IntroduzioneallaprogrammazioneinMATLAB:Parte3 20/61
CasoStudio:Fattoriale(4)◦ Dietrolequinte...
fattoriale_ricorsivo(4)
4 * fattoriale_ricorsivo(3)
3 * fattoriale_ricorsivo(2)
IntroduzioneallaprogrammazioneinMATLAB:Parte3 21/61
CasoStudio:Fattoriale(4)◦ Dietrolequinte...
fattoriale_ricorsivo(4)
4 * fattoriale_ricorsivo(3)
3 * fattoriale_ricorsivo(2)
2 * fattoriale_ricorsivo(1)
1 * fattoriale_ricorsivo(0)
IntroduzioneallaprogrammazioneinMATLAB:Parte3 22/61
CasoStudio:Fattoriale(4)◦ Dietrolequinte...
fattoriale_ricorsivo(4)
4 * fattoriale_ricorsivo(3)
3 * fattoriale_ricorsivo(2)
2 * fattoriale_ricorsivo(1)
1 * fattoriale_ricorsivo(0)
1 (Casobaseà 0!=1)
IntroduzioneallaprogrammazioneinMATLAB:Parte3 23/61
CasoStudio:Fattoriale(4)◦ Dietrolequinte...
fattoriale_ricorsivo(4)
4 * fattoriale_ricorsivo(3)
3 * fattoriale_ricorsivo(2)
2 * fattoriale_ricorsivo(1)
1 * fattoriale_ricorsivo(0)
1(Casobaseà 0!=1)
Output
1
IntroduzioneallaprogrammazioneinMATLAB:Parte3 24/61
CasoStudio:Fattoriale(4)◦ Dietrolequinte...
fattoriale_ricorsivo(4)
4 * fattoriale_ricorsivo(3)
3 * fattoriale_ricorsivo(2)
2 * fattoriale_ricorsivo(1)
1 * 1
Output
1
IntroduzioneallaprogrammazioneinMATLAB:Parte3 25/61
CasoStudio:Fattoriale(4)◦ Dietrolequinte...
fattoriale_ricorsivo(4)
4 * fattoriale_ricorsivo(3)
3 * fattoriale_ricorsivo(2)
2 * 1
Output
2
IntroduzioneallaprogrammazioneinMATLAB:Parte3 26/61
CasoStudio:Fattoriale(4)◦ Dietrolequinte...
fattoriale_ricorsivo(4)
4 *
Output
246
IntroduzioneallaprogrammazioneinMATLAB:Parte3 27/61
CasoStudio:Fattoriale(4)◦ Dietrolequinte...
>> f = fattoriale_ricorsivo(4)
f =24
IntroduzioneallaprogrammazioneinMATLAB:Parte3 28/61
CasoStudio:Fibonacci(1)◦ Nella successione di Fibonacci, ogni valore Fib(n)(n >= 0) è espresso come la somma dei dueprecedenti valori◦ Si noti che Fib(0) = 0 e Fib(1) = 1
◦Definizionericorsiva:
𝐹𝑖𝑏 𝑛 = ;0 𝑠𝑒𝑛 = 01 𝑠𝑒𝑛 = 1
𝐹𝑖𝑏 𝑛 − 1 + 𝐹𝑖𝑏(𝑛 − 2) 𝑠𝑒𝑛 ≥ 2
0, 1, 1, 2, 3, 5, 8, 13, 21, …
IntroduzioneallaprogrammazioneinMATLAB:Parte3 29/61
CasoStudio:Fibonacci(2)◦Definizionericorsiva:
𝐹𝑖𝑏 𝑛 = ;0 𝑠𝑒𝑛 = 01 𝑠𝑒𝑛 = 1
𝐹𝑖𝑏 𝑛 − 1 + 𝐹𝑖𝑏(𝑛 − 2) 𝑠𝑒𝑛 ≥ 2
IntroduzioneallaprogrammazioneinMATLAB:Parte3 30/61
CasoStudio:Fibonacci(2)◦Definizionericorsiva:
Casibase
𝐹𝑖𝑏 𝑛 = ;0 𝑠𝑒𝑛 = 01 𝑠𝑒𝑛 = 1
𝐹𝑖𝑏 𝑛 − 1 + 𝐹𝑖𝑏(𝑛 − 2) 𝑠𝑒𝑛 ≥ 2
IntroduzioneallaprogrammazioneinMATLAB:Parte3 31/61
CasoStudio:Fibonacci(2)◦Definizionericorsiva:
Versionepiùsemplicedelladefinizione
𝐹𝑖𝑏 𝑛 = ;0 𝑠𝑒𝑛 = 01 𝑠𝑒𝑛 = 1
𝐹𝑖𝑏 𝑛 − 1 + 𝐹𝑖𝑏(𝑛 − 2) 𝑠𝑒𝑛 ≥ 2
IntroduzioneallaprogrammazioneinMATLAB:Parte3 32/61
CasoStudio:Fibonacci(3)◦ CodiceMATLAB
function [valore] = fibonacci_ricorsivo(n)if n == 0
valore = 0;elseif n == 1;
valore = 1;else
valore = fibonacci_ricorsivo(n - 1) + fibonacci_ricorsivo(n - 2);end
end
𝐹𝑖𝑏 𝑛 = ;0 𝑠𝑒𝑛 = 01 𝑠𝑒𝑛 = 1
𝐹𝑖𝑏 𝑛 − 1 + 𝐹𝑖𝑏(𝑛 − 2) 𝑠𝑒𝑛 ≥ 2
IntroduzioneallaprogrammazioneinMATLAB:Parte3 33/61
CasoStudio:Fibonacci(3)◦ CodiceMATLAB
function [valore] = fibonacci_ricorsivo(n)if n == 0
valore = 0;elseif n == 1;
valore = 1;else
valore = fibonacci_ricorsivo(n - 1) + fibonacci_ricorsivo(n - 2);end
end
𝐹𝑖𝑏 𝑛 = ;0 𝑠𝑒𝑛 = 01 𝑠𝑒𝑛 = 1
𝐹𝑖𝑏 𝑛 − 1 + 𝐹𝑖𝑏(𝑛 − 2) 𝑠𝑒𝑛 ≥ 2
Invocazioniricorsive
IntroduzioneallaprogrammazioneinMATLAB:Parte3 34/61
CasoStudio:Fibonacci(3)◦ CodiceMATLAB
◦ Esempid’uso
function [valore] = fibonacci_ricorsivo(n)if n == 0
valore = 0;elseif n == 1;
valore = 1;else
valore = fibonacci_ricorsivo(n - 1) + fibonacci_ricorsivo(n - 2);end
end
>> fibonacci_ricorsivo(0)ans =
0>> fibonacci_ricorsivo(4)ans =
3>> fibonacci_ricorsivo(8)ans =
21
IntroduzioneallaprogrammazioneinMATLAB:Parte3 35/61
Quandousarelaricorsione◦ La ricorsione deve essere evitata quando esiste unasoluzione iterativa ovvia, e in situazioni in cui leprestazioni del sistema sono un elemento critico.
◦ Algoritmi che per loro natura sono ricorsivi piuttostoche iterativi dovrebbero essere formulati conprocedure ricorsive. Ad esempio, considerare chealcune strutture dati sono inerentemente ricorsive:◦ Struttureadalbero◦ Sequenze◦ …..
IntroduzioneallaprogrammazioneinMATLAB:Parte3 36/61
Debugging(1)◦ Il debugging (o semplicemente debug), ininformatica, indica l'attività che consistenell'individuazione da parte del programmatoredella porzione di software affetta da errore (bug).◦ L’editor che mette a disposizione MATLAB per lascrittura degli M-file contiene anche unDebugger, che ha lo scopo di supportare ilprogrammatore durante il debugging.◦ Va detto che i programmi MATLAB sonogeneralmente brevi, e non richiedono undebugger a meno non siano di grandi dimensioni.
IntroduzioneallaprogrammazioneinMATLAB:Parte3 37/61
Debugging(2)◦ Una prima tecnicadi debugging è lamodalità cella, dausare con gli script.
◦ Consiste nel raggruppare uninsieme di comandi in una cella, ilcui inizio è stabilito dal doppiopercentuale.
◦ Una volta definite le celle possono essere valutatesingolarmente, passare da una cella ad un’altra evalutare l’intero programma.
IntroduzioneallaprogrammazioneinMATLAB:Parte3 38/61
Debugging(3)◦ Consideriamo il seguente esempio:
◦ Se digitiamo e salviamo questo file, possiamonotare che esso è stato suddiviso in tre porzioni.
%%clear, clc;x = linspace(0, 10, 300);%% Funzione Quadraticay1 = 2.*x.^2 + 1.*x + 3;%% Funzione Cubicay2 = 4.*x.^3-2.*x.^2 + 3;
IntroduzioneallaprogrammazioneinMATLAB:Parte3 39/61
Debugging(3)◦ Consideriamo il seguente esempio:
◦ Se digitiamo e salviamo questo file, possiamonotare che esso è stato suddiviso in tre porzioni.
%%clear, clc;x = linspace(0, 10, 300);%% Funzione Quadraticay1 = 2.*x.^2 + 1.*x + 3;%% Funzione Cubicay2 = 4.*x.^3-2.*x.^2 + 3;
IntroduzioneallaprogrammazioneinMATLAB:Parte3 40/61
Debugging(4)◦ È possibile eseguire lo script nella sua interezza,oppure sezione per sezione, o solo unadeterminata sezione:
Esegue tutto loscript.
IntroduzioneallaprogrammazioneinMATLAB:Parte3 41/61
Debugging(4)◦ È possibile eseguire lo script nella sua interezza,oppure sezione per sezione, o solo unadeterminata sezione:
Esegue solo la cella sele-zionata, o corrente.
IntroduzioneallaprogrammazioneinMATLAB:Parte3 42/61
Debugging(4)◦ È possibile eseguire lo script nella sua interezza,oppure sezione per sezione, o solo unadeterminata sezione:
Sposta la selezione allaprossima cella.
IntroduzioneallaprogrammazioneinMATLAB:Parte3 43/61
Debugging(4)◦ È possibile eseguire lo script nella sua interezza,oppure sezione per sezione, o solo unadeterminata sezione:
Esegue la cella attual-mente sezionata, e siposizione alla successiva.
IntroduzioneallaprogrammazioneinMATLAB:Parte3 44/61
Debugging(4)◦ È possibile eseguire lo script nella sua interezza,oppure sezione per sezione, o solo unadeterminata sezione:
Esegue tutto lo script emisura il suo tempo diesecuzione.
IntroduzioneallaprogrammazioneinMATLAB:Parte3 45/61
Debugging(5)◦ La modalità Debug è un altro meccanismo persupportare il debugging e consiste nel collocareall’interno dell’M-file i cosiddetti breakpoints:◦ Un punto all’interno del programma in corrispondenzadel quale l’esecuzione si interrompe temporaneamentein modo che il programmatore possa esaminare i valoricorrenti delle variabili.
◦ L’editor di MATLAB mette a disposizione unapposito menù per la gestione dei breakpointsall’interno di un programma (loro creazione e/ocancellazione).
IntroduzioneallaprogrammazioneinMATLAB:Parte3 46/61
Debugging(6)
Cancella tutti i breakpoints nel pro-gramma.
IntroduzioneallaprogrammazioneinMATLAB:Parte3 47/61
Debugging(6)
Inserisce o rimuove un breakpointalla riga corrente (ovvero dove ècollocato il cursore).
IntroduzioneallaprogrammazioneinMATLAB:Parte3 48/61
Debugging(6)
Abilita, o disabilita, il breakpointcollocato alla riga corrente.Quando un breakpoint è dis-abilitato, non è consideratoquando il programma è eseguito.
IntroduzioneallaprogrammazioneinMATLAB:Parte3 49/61
Debugging(6)
La considerazione di un breakpointpuò essere condizionata allaverifica di una determinatacondizione, dati i valori correntidelle variabili. La condizione èvalutata prima dell’esecuzionedella riga del breakpoint.
IntroduzioneallaprogrammazioneinMATLAB:Parte3 50/61
Debugging(6)
Strategie di gestione di eventualierrori di programmazione quandol’M-file viene eseguito.
IntroduzioneallaprogrammazioneinMATLAB:Parte3 51/61
Debugging(7)
Quando un breakpoint è collocatoin una riga, l’editor lo segnala conun pallino rosso.
◦ Se scegliamo di eseguire lo script vediamo cheal punto del breakpoint si ha un’interruzione.
IntroduzioneallaprogrammazioneinMATLAB:Parte3 52/61
Debugging(7)
◦Appare un menù così che il programmatorepuò scegliere cosa fare.
IntroduzioneallaprogrammazioneinMATLAB:Parte3 53/61
Debugging(7)
◦Appare un menù così che il programmatorepuò scegliere cosa fare.
Continuare l’esecuzione fino alprossimo breakpoint o la fine delprogramma.
IntroduzioneallaprogrammazioneinMATLAB:Parte3 54/61
Debugging(7)
◦Appare un menù così che il programmatorepuò scegliere cosa fare.
Eseguire solo la prossima riga.
IntroduzioneallaprogrammazioneinMATLAB:Parte3 55/61
Debugging(7)
◦Appare un menù così che il programmatorepuò scegliere cosa fare.
Eseguire la prossima riga, edentrare nel codice dell’eventualefunzione chiamata, oppureeseguire la funzione fino ad uscireda essa.
IntroduzioneallaprogrammazioneinMATLAB:Parte3 56/61
Debugging(7)
IntroduzioneallaprogrammazioneinMATLAB:Parte3 57/61
Debugging(7)
IntroduzioneallaprogrammazioneinMATLAB:Parte3 58/61
Debugging(8)
◦Appare un menù così che il programmatorepuò scegliere cosa fare.
Eseguire fino alla riga che contieneil cursore.
IntroduzioneallaprogrammazioneinMATLAB:Parte3 59/61
Debugging(9)
◦Appare un menù così che il programmatorepuò scegliere cosa fare.
Interrompere il debugging.
IntroduzioneallaprogrammazioneinMATLAB:Parte3 60/61
Riferimenti• Capitolo4• Paragrafi8[DebuggingdeiprogrammidiMatlab].
61/61IntroduzioneallaprogrammazioneinMATLAB:Parte3