Funzioni iterative (soluzioni degli esercizi proposti il 5 Ottobre)
program Fibonacci;
VEDERE LEZIONE DEL 12 OTTOBRE
program Somma;
var n,m,s,z: integer;
begin
write('Calcolo di n+m; n,m = ? ');
readln(n,m);
s:= n;
z:= 0;
while z < m do begin {inv. s = n + z}
s:= s+1;
z:= z+1
end; {post: s = n + m}
write(n:5,' +',m:5,' =',s:5)
end.
program Differenza_naturale;
{pre: n,m>=0 interi}
{post: calcolo e stampa di n -- m dove
n -- m = n-m se n>m,
n -- m = 0 altrimenti.
}
var n, m, i, p: integer;
function predecessore(n: integer): integer;
begin
if n = 0 then predecessore:= 0
else predecessore:= n-1
end;
begin {n -- m = predecessore^(m)(n) dove, in generale,
f^(0)(x) = x, f^(n+1)(x) = f(f^(n)(x)}
readln(n,m);
i:= 0;
p:= n;
while i < m do {inv. p = predecessore^(i)(n)}
begin
p:= predecessore(p);
i:= i+1
end; {i = m, dunque p = predecessore^(m)(n) = n -- m}
writeln(p)
end.
NOTA: questo programma non l'abbiamo fatto insieme, ma vi dovrebbe essere
chiaro, essendo un'altra applicazione dell'iterazione, questa volta
facente uso di una "funzione" di nome 'predecessore'.
program Esponenziazione;
{pre: n,m>=0 interi}
{post: calcolo e stampa di n^m, per n,m>=0, iterando il prodotto}
var n, m, i, e: integer;
begin
readln(n,m);
e:= 1; {e = n^0}
for i:= 0 to m-1 do {inv. e = n^i}
e:= e*n;
writeln(e) {i = m, dunque e = n^m}
end.
NOTA: se facciamo il ciclo 'for' da 1 a m, anziche` da 0 a m-1,
l'invariante di ciclo sara` e = n^(i-1).
program Moltiplicazione_veloce;
VEDERE LEZIONE DEL 26 OTTOBRE