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