Sorry for the delay. I have been thinking about this problem off and on for
the last 2 weeks. This is my second try. Could this be done any more
efficiently? Thanks.
#!/usr/bin/perl
use warnings;
use strict;
my @data = 1 .. 4; # qw(man bites dog);
permute([EMAIL PROTECTED]);
sub permute {
my $ref = ref $_[0] eq 'ARRAY' ? shift : [EMAIL PROTECTED];
foreach my $i( 0 .. $#$ref ) {
# Is this efficient?
my @circular = @$ref[0 .. $i-1, $i+1 .. $#$ref];
foreach ( 0 .. $#circular ) {
foreach ( 1 .. $#circular ) {
print join(' ', $ref->[$i], @circular), "\n";
# Is this efficient?
push @circular, splice @circular, 1, 1;
}
# Is this efficient?
push @circular, shift @circular;
}
}
}
-----Original Message-----
From: David J Kirol
Sent: Sunday, June 27, 2004 9:30 PM
To: Zeus Odin
Subject: Re: How efficient is this permutation algorithm?
Your permute is not actually doing a permutation.
if @data is set to 1 .. 4, your algorithm yields:
1 2 3 4
1 3 4 2
1 4 2 3
2 1 3 4
2 3 4 1
2 4 1 3
3 1 2 4
3 2 4 1
3 4 1 2
4 1 2 3
4 2 3 1
4 3 1 2
fully half the permutations are missing. Condider:
1 2 3 4
m 1 2 4 3
1 3 4 2
m 1 3 2 4
1 4 2 3
m 1 4 3 2
2 1 3 4
m 2 1 4 3
2 3 4 1
m 2 3 1 4
2 4 1 3
m 2 4 3 1
3 1 2 4
m 3 1 4 2
3 2 4 1
m 3 2 1 4
3 4 1 2
m 3 4 2 1
4 1 2 3
m 4 1 3 2
4 2 3 1
m 4 2 1 3
4 3 1 2
m 4 3 2 1
Each 'missing' permutation is labeled with an 'm'.
HTH
Dave
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>