J'ai dû résoudre ce problème précis il y a quelques années. Je n'ai pas pu trouver ma propre solution, mais plutôt couru à travers ce merveilleux morceau de code qui implique l'utilisation intelligente et judicieuse de map
avec récursion:
#!/usr/bin/perl
print "permute:\n";
print "[", join(", ", @$_), "]\n" for permute([1,2,3], [4,5,6], [7,8,9]);
sub permute {
my $last = pop @_;
unless(@_) {
return map([$_], @$last);
}
return map {
my $left = $_;
map([@$left, $_], @$last)
}
permute(@_);
}
Oui, cela semble fou, mais permettez-moi expliquer! La fonction se recurera jusqu'à ce que @_
soit vide, auquel cas elle renvoie ([1], [2], [3])
(une liste de trois arrayrefs) au niveau de récursion précédent. A ce niveau $last
est une référence à un tableau qui contient [4, 5, 6]
.
Le corps de la carte externe est ensuite exécuté trois fois avec $_
ensemble à [1]
, puis [2]
et enfin [3]
. La carte interne est ensuite exécutée sur (4, 5, 6)
pour chaque itération de la carte externe et renvoie ([1, 4], [1, 5], [1, 6])
, ([2, 4], [2, 5], [2, 6])
et enfin ([3, 4], [3, 5], [3, 6])
.
Le dernier appel récursif mais unique renvoie ([1, 4], [1, 5], [1, 6], [2, 4], [2, 5], [2, 6], [3, 4], [3, 5], [3, 6])
.
Ensuite, il court contre ce résultat [7,8,9]
, ce qui vous donne [1, 4, 7], [1, 4, 8], [1, 4, 9], [1, 5, 7], [1, 5, 8], [1, 5, 9], [1, 6, 7], [1, 6, 8], [1, 6, 9], [2, 4, 7], [2, 4, 8], [2, 4, 9], [2, 5, 7], [2, 5, 8], [2, 5, 9], [2, 6, 7], [2, 6, 8], [2, 6, 9], [3, 4, 7], [3, 4, 8], [3, 4, 9], [3, 5, 7], [3, 5, 8], [3, 5, 9], [3, 6, 7], [3, 6, 8], [3, 6, 9]
Je me souviens de poster une question sur perlmonks.org demander à quelqu'un de me l'expliquer.
Vous pouvez facilement adapter cette solution à votre problème.
Ce n'est pas permutation - permutation est ordonnancements d'un ensemble donné (par exemple {a, b, c} -> (a, b, c), (a, c, b), (b, a, c), ...). – Cascabel
oh désolé. Je ne savais pas. Est-ce des combinaisons ?? – user295033
En fait, je viens de remarquer qu'il s'agit d'un doublon: Voir http://stackoverflow.com/questions/1256036/in-perl-how-can-i-iterate-over-the-cartesian-product-of-multiple-sets –