PROGRAM Fibonacci;
VAR n:INTEGER;
{ **************** Primy vypocet
****************** }
FUNCTION FibDif(k:INTEGER):LONGINT;
VAR sq5,f1,f2: REAL;
BEGIN
sq5:=SQRT(5.0);
f1:=EXP((k+1)*LN(0.5*sq5+0.5));
f2:=EXP((k+1)*LN(0.5*sq5-0.5));
IF (k MOD 2=1) THEN f2:=-f2;
FibDif:=ROUND((f1+f2)/sq5);
END;
{ **************** Vypocet posloupnosti
****************** }
FUNCTION FibPosl(k:INTEGER):LONGINT;
VAR f1,f2,ff: LONGINT;
i: INTEGER;
BEGIN
f1:=1; f2:=1; ff:=1;
FOR i:=2 TO k DO BEGIN
ff:=f1+f2;
f2:=f1;
f1:=ff;
END;
FibPosl:=ff
END;
{ **************** Vypocet rekurentnim
volanim ****************** }
FUNCTION FibRek(k:INTEGER):LONGINT;
BEGIN
IF ((k=0)OR(k=1)) THEN
FibRek:=1
ELSE
FibRek:=FibRek(k-1)+FibRek(k-2);
END;
BEGIN
WRITE('n=');
READLN(n);
WRITE('Primy vypocet: F_n=');
WRITELN(FibDif(n));
WRITE('Vypocet rekurentnim vzorcem: F_n=');
WRITELN(FibPosl(n));
{ WRITE('Vypocet rekurentnim volanim: F_n=');
WRITELN(FibRek(n));}
READLN
END.