{ File: fattoria.pas }

{ Scopo: primo esempio di funzione ricorsiva
         confronto fra un algoritmo iterativo e uno ricorsivo }

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

{ 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 FattorialeRicorsivo (n: longint): longint;
  begin
    if n = 0 then                { caso base }
      FattorialeRicorsivo := 1
    else                         { caso ricorsivo }
      FattorialeRicorsivo := n * FattorialeRicorsivo(n - 1)
  end; { FattorialeRicorsivo }


  function FattorialeIterativo (n: longint): longint;
  var
    f, i : longint;

  begin { FattorialeIterativo }
    f := 1;
    for i := 1 to n do
      f := f * i;
    FattorialeIterativo := f
  end; { FattorialeIterativo }


begin { CalcoloFattoriale }
  write('Inserisci un numero intero! ');
  readln(numero);
  writeln;
  writeln('Fattoriale (calcolato con una funzione iterativa): ',
          FattorialeIterativo(numero));
  writeln('Fattoriale (calcolato con una funzione ricorsiva): ',
          FattorialeRicorsivo(numero))
end. { CalcoloFattoriale }