-+  Associazione
-+  Documenti
 |-  Modern Perl
 |-  Bibliografia
 |-  Articoli
 |-  Talk
 |-  Perlfunc
 |-  F.A.Q.
 |-  F.A.Q. iclp
-+  Eventi
-+  Community
-+  Blog
-+  Link
Corso di Perl



 


indietro

[51] Come permuto N elementi di una lista?

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;

vedi in inglese

AUTORE E COPYRIGHT

Copyright (c) 1997, 1998, 1999, 2000, 2001 Tom Christiansen e Nathan Torkington. Tutti i diritti riservati.

Questa documentazione è libera; puoi ridistribuirla e/o modificarla secondo gli stessi termini applicati al Perl.

Indipendentemente dalle modalitè di distribuzione, tutti gli esempi di codice in questo file sono rilasciati al pubblico dominio. Potete, e siete incoraggiati a farlo, utilizzare il presente codice o qualunque forma derivata da esso nei vostri programmi per divertimento o per profitto. Un semplice commento nel codice che dia riconoscimento alle FAQ sarebbe cortese ma non è obbligatorio.

D:
Progetti e documenti in rilievo
Corso di Perl Progetto pod2it
D:
La ML di Perl.it
mongers@perl.it è la lista ufficiale di Perl Mongers Italia per porre quesiti di tipo tecnico, per rimanere aggiornato su meeting, incontri, manifestazioni e novità su Perl.it.
Iscriviti!
D:
Annunci Google