Fibonacci (soluzione alternativa)
program Fibonacci;
{pre: n >= 0 intero}
{post: calcolo e stampa del valore f(n), dove f e' la funzione:
f(0) = 0
f(1) = 1
f(n+2) = f(n)+f(n+1)
}
var a, b, i, n, fib: longint;
begin
readln(n);
if n = 0 then fib:= 0 {fib = f(0) = 0}
else {calcolo di f(n) per n >= 1}
begin
a:= 0; {a = f(0)}
b:= 1; {b = f(1)}
for i:= 1 to n-1 do {inv. a = f(i-1), b = f(i)}
begin
b:= a+b;
a:= b-a {oppure c:= a+b; a:= b; b:= c}
end;
fib:= b {i = n, dunque fib = b = f(i) = f(n)}
end;
writeln(fib)
end.
NOTA: se n = 1 allora viene eseguito l'else, ma non il corpo
del ciclo; tuttavia la postcondizione del ciclo e' valida
a causa dell'inizializzazione di b ad 1.