{+----------------------------------------------------------------------+
 |     Vypocet Fibonacciho cisel ruznymi metodami                       |
 +----------------------------------------------------------------------+}

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.