Esercizi svolti a lezione il 12 Ottobre 2000
program Fibonacci; {versione fatta in classe e in laboratorio}
{pre: n >= 0, intero}
{post: fib = f(n), dove f e` la funzione:
f(0) = 0 (caso base);
f(1) = 1 (caso base);
f(n+2) = f(n+1) + f(n) (caso induttivo).}
var a,b,c,i,n,fib:integer;
begin
a:=0; b:=1; c:=1; {a=f(0);b=f(1);c=f(1)}
readln(n);
if n=0 then fib:=0 {fib=0=fib(0)}
else if n=1 then fib:=1 {fib=1=fib(1)}
else
begin
for i:=1 to n-1 do
begin
c:=a+b;
a:=b;
b:=c; {INVARIANTE di CICLO: a=f(i-1);c=b=f(i)}
end;
fib:=c; {i=n, dunque fib=c=f(i)=f(n)}
end;
writeln(fib);
readln;
end.
NOTA 1: il caso induttivo si puo` scrivere anche come:
f(n) = f(n-1)+f(n-2), se n diverso da 0, 1.
NOTA 2: l'inizializzazione c:=1 serve solo a rendere l'invariante vero
anche per i = 1. L'algoritmo funziona anche con l'inizializzazione
c:=0. Confrontate questa versione del programma con la soluzione
a vostra disposizione qui sotto.
Soluzione alternativa.