tartaglia.pas

{ COMIENZO DE DESCRIPCION

C\'alculo del n\'umero combinatorio $ C (n,r) $, donde
$ 0 \le r \le n $, usando el tri\'angulo de Tartaglia
(o de Pascal) mediante:
i)  un procedimiento (muy caro) basado en la siguiente
    propiedad recursiva:
    $ C (n,r) = 1 $, si $r=0$ o $r=n$, sino
    $ C (n,r) = C (n-1,r-1) + C (n-1,r) $, en los
    dem\'as casos;
ii) un procedimiento por programaci\'on din\'amica, en
    donde directamente se construye el tri\'angulo de
    Tartaglia hasta el nivel requerido.
Por ejemplo, para el n\'umero combinatorio $ C (30,12) $
constatamos $k1=172.986.449$ llamadas de recursi\'on,
las cuales se reducen a $k2=930$ operaciones por
programaci\'on din\'amica.
keywords: algoritmos

FIN DE DESCRIPCION }
{
 numero        nro de llamadas           nro de llamadas
 combinatorio    por recursion        por prog. dinamica
 C (16, 8)              25.739                       129   
 C (30,12)         172.986.449                       930
}
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
{ Id: tartaglia.pas 2002/06/20 mstorti Exp jdelia rodrigop  }

program  tartaglia ;
const
  Nbig = 100;
	
type
  entero = longint ;
	  
var 
  count1 : entero ; { contador llamadas recursivas }
  count2 : entero ; { contador operac. en el trian. Pascal }
  a : array [1..Nbig, 1..Nbig] of entero;

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
procedure ERROR (s : string) ;
begin
   write ('ERROR: ');
   writeln (s);
   halt ;
end ; { procedure }

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
procedure LEE_DATOS (var n, r: entero);
begin
   writeln ;
   writeln (' Calculo del numero combinatorio C (n r) ');
   writeln (' en donde 0 <= r <= n, por: ');
   writeln (' a) recursion (muy caro)    ');
   writeln (' b) programacion dinamica   ');
   writeln ;
   write   (' numero de elementos         ; n = ? ');
   readln  (n);
   write   (' a tomar en combinaciones de ; r = ? ');
   readln  (r);
   if ( n < 0    ) then ERROR (' debe ser n >= 0 ') ;
   if ( r < 0    ) then ERROR (' debe ser r >= 0 ') ;
   if ( r > n    ) then ERROR (' debe ser 0 <= r <= n ') ;
   if ( n > Nbig ) then ERROR (' n > Nbig ') ;
end ;

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
{ numero combinatorio por propiedad recursiva en el
  triangulo de Pascal (o de Tartaglia)                      }
function TARTA1 (n, r: entero): entero ;
begin
   count1 := count1 + 1 ;
   if  ( n = 1 ) or ( r = 0 ) or ( r = n ) then
     TARTA1 := 1
   else begin
     TARTA1 := TARTA1 (n - 1, r) + TARTA1 (n - 1, r - 1)
   end ; {if}
end ;

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
{ numero combinatorio por programacion dinamica, en donde
  directamente se construye el triangulo de Pascal          }
function PASCALBIN (n, m : entero): entero;
var
   i, j : entero;
begin  
   for i := 1 to (n) do begin
      for j := 1 to (n + 1) do begin
	 if (j = 1) or (j = i+1) then
	    a [i,j] := 1
	 else begin
	    a [i,j] := a [i-1, j-1] + a [i-1,j];
	 end ; {if}
	 count2 := count2 + 1;
      end ; {j}
   end ; {i}
   PASCALBIN := a [n, m+1];
end;
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
{ programa ppal}
var	  
   n, r, z1, z2 : entero ;
begin	       
   count1 := 0 ;
   count2 := 0 ;
   LEE_DATOS (n, r);
   z1 := TARTA1    (n, r) ;
   z2 := PASCALBIN (n, r) ;
   writeln ;
   writeln (' por recursion             C (n,r) = ', z1);
   writeln (' por programacion dinamica C (n,r) = ', z2);
   writeln ;
   writeln (' nro de llamadas recursivas        = ', count1);
   writeln (' nro de operac. en progr. dinamica = ', count2);
   writeln (' ');
end .

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}

Generated by GNU enscript 1.6.1.