{ File: fattdeb.pas }

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

program CalcoloFattoriale;
{ Calcola il fattoriale di un numero intero, applicando un algoritmo ricorsivo. }

{ 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 Fattoriale (n: longint): longint;
  { Calcolo del fattoriale usando un metodo ricorsivo.
    Versione modificata e non ottimale che usa una variabile ausiliaria per
    visualizzare il risultato restituito dalla chiamata ricorsiva attraverso un
    debugger. }
  var
    prec : longint;

  begin { Fattoriale }
    if n = 0 then                { caso base }
      Fattoriale := 1
    else                         { caso ricorsivo }
    begin
      prec := Fattoriale(n - 1);
      Fattoriale := n * prec
    end
  end; { Fattoriale }


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