Algoritmi su Tipi Semplici Nicola Fanizzi Laboratorio - Corso di Programmazione (B) C.d.L. in Informatica DIB - Università degli Studi di Bari Successione di Fibonacci problema: generare e stampare i primi n termini della successione di Fibonacci: 0, 1, 1, 2, 3, 5, 8, 13, ... soluzione: nuovo = precedente + precedente del precedente c b a a:= 0; b:= 1; c:= a+b; … poi gestire lo scambio dei ruoli: – il nuovo termine diventa quello corrente – il precedente diventa il precedente del precedente 2 Successione di Fibonacci (2) a := 0; b := 1; i := 2; while i < n do begin i := i + 1; c := a + b; a := b; b := c; end 3 Successione di Fibonacci (3) 4 program Fibonacci (input,output); var a,b,i,n: integer; begin a := 0; b := 1; i := 2; write('Quanti termini della serie devo stampare ?: '); readln(n); while i < n do begin write(a,',',b,','); a := a + b; b := a + b; i := i + 2; end; if i = n then writeln(a,',',b) else writeln(a) end. Calcolo del Massimo Comun Divisore problema: dati due interi positivi, n e m, calcolare il loro massimo comun divisore supponiamo n > m soluzione banale: – scomporre i due numeri separatamente nei loro fattori – nelle due liste di fattori trovare il massimo elemento comune 5 Calcolo del Massimo Comun Divisore Algoritmo Euclideo A B C n x x x m p segmenti di dimensione x q segmenti di dimensione x Osservazioni: – un divisore esatto spezza un intero in parti uguali – il MCD di n e m non è maggiore di m – il MCD di n e m è anche MCD di m e n-m 6 Strategia: – dividere il n per m – se il resto è nullo allora m è il MCD cercato altrimenti ripetere la procedura su m e n-m Implementazione Algoritmo Euclideo program mcd (input,output); var n,m,r: integer; begin writeln('Massimo Comun Divisore'); write('Immettere l''intero maggiore: '); readln(n); write('Immettere l''intero minore: '); readln(m); repeat r := n mod m; n := m; m := r; until r = 0; 7 writeln('MCD = ',n) end. Generazione Numeri Pseudo-Casuali problema: utilizzare il metodo delle congruenze per produrre un insieme uniforme di numeri pseudocasuali successione lineare congruente: xn+1 = (axn + b) mod m parametri: – m modulo – x0 –a –b 8 1. modulo senza arrotondamenti 2. maggiore della lunghezza della sequenza seme 0 x0 m moltiplicatore sqrt(m) a m - sqrt(m) incremento dispari, non multiplo di 5 primo rispetto a m Implementazione Generazione Numeri Pseudo-Casuali program random (input,output); var x,a,b,m: integer; c: char begin m := 4096; b := 853; a := 109; write('Immettere il numero seme x_0: '); readln(x); repeat x := (a * x + b) mod m; writeln(x); write('continua [S/n] ?'); readln(c) until c = 'n' end. 9