Las pruebas las he hecho con conjuntos pequeños, pero a nada que un mensaje se alargue, el array puede ser kilométrico. ¿Sería necesario volcar los conjuntos a un archivo e ir leyéndolos de éste? ¿Dónde estaría el límite?
Por otro lado, en una subrutina de cálculo de factorial, si se calcula el factorial de un número algo por encima de 120, aplicando Stirling, sale "inf" (infinito).
Sin embargo recuerdo, hace años, haber hecho alguna cosa en Perl con números enormes... Pero no recuerdo cómo... ¿Alguna idea?
Using perl Syntax Highlighting
- #!/usr/bin/perl
- use strict;
- use warnings;
- use utf8::all;
- use constant PI =>4 * atan2(1,1);
- use constant E =>2.7182818;
- use constant LIM => 100;
- sub factorial{
- #Recibe un entero como parámetro
- #Devuelve el factorial. Utilizo la aproximación de Stirling para valores superiores a LIM
- #y un bucle para los menores.
- print "Calculando el factorial de $_[0]\n";
- my $n_factorial=1;
- if($_[0] >= LIM) {
- print "Calculando mediante Stirling\n";
- $n_factorial = ($_[0]**$_[0])*(E**(-$_[0]))*sqrt(2*PI*$_[0])*(1 + 1/(12*$_[0]));
- }
- else{
- print "Calculando directamente\n";
- for(my $i = $_[0] ; $i > 1 ; $i--){
- $n_factorial *= $i;
- }
- }
- $n_factorial;
- }
- sub var_rep{
- #Recibe dos parámetros: el total de elementos y el número de seleccionados
- #Devuelve el número de variaciones con repetición
- print "Calculando las variaciones con repetición de $_[0] elementos tomados de $_[1] en $_[1]\n";
- my $var_rep = &factorial($_[0]) / &factorial($_[0]-$_[1]);
- print "Hay $var_rep variaciones con repetición\n";
- }
- sub generador_var_rep{
- #Recibe una cadena y genera todas las variaciones con repetición
- # de los n elementos sin repetición de la cadena tomados de 2 en 2.
- my @cadena = split //,$_[0];
- my @digrafos;
- my %depuración;
- my @salida;
- for(my $ind = 0; $ind <= $#cadena ; $ind++){
- for(my $i = 0; $i <= $#cadena ; $i++){
- if( $ind != $i) {push @digrafos, $cadena[$ind].$cadena[$i];}
- }
- }
- foreach(@digrafos){
- $depuración{$_}=1;
- }
- @salida = sort keys %depuración;
- return \@salida;
- }
- my $cadena = qw(ABCDE);
- my $ref_digrafos = &generador_var_rep($cadena);
- my @digrafos = @{$ref_digrafos};
- my $num_digrafos = @digrafos;
- print $num_digrafos, "\t",join("\t",@digrafos), "\n\n";
Coloreado en 0.005 segundos, usando GeSHi 1.0.8.4