sub permutations { my $bag = $_[0]; if (is_empty_list($bag)) { return [[]]; } my $perms = []; foreach my $elem (@$bag) { foreach my $perm (@{permutations(remove($elem, $bag, 1))}) { unshift(@{$perm}, $elem); push(@{$perms}, $perm); } } return $perms; }