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.