{ File: fibodeb.pas }

{ Scopo: funzione ricorsiva con ricorsione multipla;
         versione adatta ad essere eseguita in modalita` di debugging }

program CalcoloFibonacci;
{ Dato un numero intero n calcola l'n-esimo numero di Fibonacci usando una
  funzione ricorsiva.

  L'i-esimo numero di Fibonacci F(i) e` definito attraverso la seguente
  definizione induttiva:

     F(i) = 0                 se i = 0
     F(i) = 1                 se i = 1
     F(i) = F(i-1) + F(i-2)   se i >= 2
}

{ Utilizza il tipo predefinito del TurboPascal longint, che permette di
  rappresentare interi nell'intervallo da -2^31 a 2^31-1. }

var
  numero : longint;


  function Fibonacci (n: longint): longint;
  { Calcola l'n-esimo numero di Fibonacci usando un metodo ricorsivo.
    Versione modificata e non ottimale che usa due variabili ausiliarie per
    visualizzare il risultato restituito dalla chiamata ricorsiva attraverso un
    debugger. }
  var
    f1, f2 : longint;

  begin { Fibonacci }
    if n = 0 then
      Fibonacci := 0
    else if n = 1 then
      Fibonacci := 1
    else
    begin
      f1 := Fibonacci(n - 1);
      f2 := Fibonacci(n - 2);
      Fibonacci := f1 + f2
    end
  end; { Fibonacci }


begin { CalcoloFibonacci }
  numero := 0;
  repeat
    write('Immetti un numero intero nonnegativo (o negativo per terminare)! ');
    readln(numero);
    if numero >= 0 then
      writeln('Il ', numero, '-simo numero di Fibonacci e'': ',
              Fibonacci(numero));
  until numero < 0
end. { CalcoloFibonacci }