Usate il modulo List::Permutor su CPAN. Se la lista è in effetti un array,
provate il modulo Algorithm::Permute (anch'esso su CPAN). È scritto in codice XS
ed è molto efficiente.
use Algorithm::Permute;
my @array = 'a'..'d';
my $p_iteratore = Algorithm::Permute->new ( \@array );
while (my @perm = $p_iteratore->next) {
print "prossima permutazione: (@perm)\n";
}
Per un'esecuzione ancora più veloce, potreste fare:
use Algorithm::Permute;
my @array = 'a'..'d';
Algorithm::Permute::permute {
print "prossima permutazione: (@array)\n";
} @array;
Ecco un piccolo programma che genera tutte le permutazioni di tutte le
parole su ciascuna linea di input. L'algoritmo racchiuso nella funzione
permute() è discusso nel Volume 4 (ancora non pubblicato) di
The Art of Computer Programming [L'Arte della Programmazione dei Computer, NdT] di
Knuth e funzionerà su qualsiasi lista:
#!/usr/bin/perl -n
# generatore ordinato di permutazioni Fischer-Kause
sub permuta (&@) {
my $codice = shift;
my @ind = 0..$#_;
while ( $codice->(@_[@ind]) ) {
my $p = $#ind;
--$p while $ind[$p-1] > $ind[$p];
my $q = $p or return;
push @ind, reverse splice @ind, $p;
++$q while $ind[$p-1] > $ind[$q];
@ind[$p-1,$q]=@ind[$q,$p-1];
}
}
permuta {print"@_\n"} split;
|