Introduzione agli algoritmi
Definizione Sistema di regole e procedure di calcolo ben definite che portano alla soluzione di un problema con un numero finito di operazioni. Deriva dal nome del matematico arabo Al- Khuwarizmi (IX secolo) Deriva dal nome del matematico arabo Al- Khuwarizmi (IX secolo) Finitezza Finitezza Determinismo (input output) Determinismo (input output)
Esempi Come prendere il caffè al distributore Introdurre limporto necessario in monete da 5, 10, 20, 50 centesimi Introdurre limporto necessario in monete da 5, 10, 20, 50 centesimi Selezionare la quantità di zucchero Selezionare la quantità di zucchero Selezionare la bevanda desiderata Selezionare la bevanda desiderata Attendere che il distributore eroghi la bevanda Attendere che il distributore eroghi la bevanda Ritirare il resto Ritirare il resto Ritirare la bevanda Ritirare la bevanda
Fattoriale di un numero Dato un numero intero positivo n, si definisce suo fattoriale il numero Dato un numero intero positivo n, si definisce suo fattoriale il numero n! = n * (n-1) * … * 2 * 1 Esempio: 4! = 4 * 3 * 2 * 1 = 24 Similmente si può calcolare la somma dei primi n numeri interi positivi Similmente si può calcolare la somma dei primi n numeri interi positivi
La ricorsione Applicato al fattoriale, abbiamo due casistiche: 1) Caso base, (n = 0) o (n = 1). n! = 1 2) Passo ricorsivo, n > 1. Supponiamo di conoscere il valore di n!. (n+1)! = (n+1) * n! In tal modo il fattoriale si può calcolare ricorsivamente per passi successivi riconducendosi al caso base che sappiamo risolvere direttamente.
Istruzioni di un algoritmo Assegnamento n c: assegna alla variabile n il valore c (c può essere una costante o una espressione da valutare) n c: assegna alla variabile n il valore c (c può essere una costante o una espressione da valutare) Esempi: 1. n 5. Assegna alla variabile n il valore 5 2. n Assegna alla variabile n il valore 3 3. n n + 1. Incrementa di uno il valore di n 4. n i + j. Assegna a n la somma dei valori correnti delle variabili i e j
Istruzioni di un algoritmo Condizionale if A then B (else C): se è vera la condizione A allora esegui B (altrimenti esegui C, opzionale). B e C possono rappresentare più istruzioni. if A then B (else C): se è vera la condizione A allora esegui B (altrimenti esegui C, opzionale). B e C possono rappresentare più istruzioni.Esempi: 1. if (n = 5) then n n + 1 (i.e. 6) 1. if (n = 5) then n n + 1 (i.e. 6) 2. if (n = 3 + 4) then n i + j else n i-j (se al momento corrente n vale 7 allora assegnagli la somma di i e j altrimenti assegnagli la differenza di i e j) 2. if (n = 3 + 4) then n i + j else n i-j (se al momento corrente n vale 7 allora assegnagli la somma di i e j altrimenti assegnagli la differenza di i e j)
Istruzioni di un algoritmo Ciclo while while A do B: finché è vera la condizione A allora esegui le istruzioni contenute in B (B può rappresentare più istruzioni) while A do B: finché è vera la condizione A allora esegui le istruzioni contenute in B (B può rappresentare più istruzioni) Esempi: 1. while ((5 <= n) and (n <= 10)) do n n while (n >= i + j) do { n n -1 n n -1 i i + 1 i i + 1 j j + i j j + i}
Istruzioni di un algoritmo Ciclo for for cont i to j do B: ripeti (j-i+1) volte le istruzioni contenute in B (B può rappresentare più istruzioni) for cont i to j do B: ripeti (j-i+1) volte le istruzioni contenute in B (B può rappresentare più istruzioni) Esempi: 1. for i 1 to n do n n+1 2. for i n+1 to n+10 do { j j * 2 j j * 2 j j + i j j + i}
Algoritmo (ricorsivo) per il fattoriale FATT(n) FATT(n) if ((n=0) or (n=1)) then return 1 else return n * FATT(n-1) else return n * FATT(n-1) Dove return è listruzione che dà in output il risultato
Algoritmo (iterativo) per il fattoriale FATT(n) FATT(n) fatt 1 i 2 while (i <= n) do { fatt fatt * i fatt fatt * i i i + 1 i i + 1}
Ordinamento di n numeri Input: una sequenza di n numeri, a 1, a 2, a 3, …, a n Input: una sequenza di n numeri, a 1, a 2, a 3, …, a n Output: una permutazione degli elementi a 1, a 2, a 3, …, a n tali che a 1 <= a 2 <= a 3 <= … <= a n Output: una permutazione degli elementi a 1, a 2, a 3, …, a n tali che a 1 <= a 2 <= a 3 <= … <= a n Tali numeri sono contenuti in una struttura chiamata vettore od array A in cui il numero di indice i (a i ) si trova in A[i] A
Insertion-Sort(A) Insertion-Sort(A) for j 2 to length(A) { key A[j] key A[j] i j -1 i j -1 while ((i > 0) and (A[i] > key)) do { while ((i > 0) and (A[i] > key)) do { A[i+1] A[i] A[i+1] A[i] i i - 1 i i - 1 } A[i+1] key A[i+1] key}
Merge-Sort(A,p,r) Merge-Sort(A,p,r) if (p < r) then { q int((p+r)/2) q int((p+r)/2) Merge-Sort(A,p,q) Merge-Sort(A,p,q) Merge-Sort(A,q+1,r) Merge-Sort(A,q+1,r) Merge(A,p,q,r) Merge(A,p,q,r) } Merge: mette assieme le parti A[p;q] e A[q+1;r] che sono già ordinate