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
Successione di Fibonacci (2) i := 2; while i < n do begin i := i + 1; c := a + b; a := b; b := c; end
Successione di Fibonacci (3) 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
Calcolo del Massimo Comun Divisore Algoritmo Euclideo x p segmenti di dimensione x q segmenti di dimensione x n m A B C 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 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; writeln('MCD = ',n) end.
Generazione Numeri Pseudo-Casuali problema: utilizzare il metodo delle congruenze per produrre un insieme uniforme di numeri pseudo-casuali successione lineare congruente: xn+1 = (axn + b) mod m parametri: m modulo 1. modulo senza arrotondamenti 2. maggiore della lunghezza della sequenza x0 seme 0 x0 m a moltiplicatore sqrt(m) a m - sqrt(m) b 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.