XP is just a number PerlMonks

### Re^2: Permuting with duplicates and no memory

by jettero (Monsignor)
 on Apr 01, 2007 at 15:01 UTC ( #607704=note: print w/replies, xml ) Need Help??

I borrowed this for something and noticed that if \$num=8 this produces only 40319 permutations... I made the following el cheapo minor modification on mine.

```sub make_orderings
{
my \$num = shift;

my @arr = (1 .. \$num);
my \$first = 1;

return sub {
if( \$first ) {
\$first = 0;
return @arr;
}
my \$last = \$#arr;

my \$i = \$last - 1;
\$i-- while 0 <= \$i && \$arr[\$i] >= \$arr[\$i+1];
return if \$i == -1;

@arr[\$i+1..\$last] = reverse @arr[\$i+1..\$last]
if \$arr[\$i+1] > \$arr[\$last];

my \$j=\$i+1;
\$j++ while \$arr[\$i] >= \$arr[\$j];

@arr[\$i,\$j] = @arr[\$j,\$i];

return @arr;
}
}

-Paul

Replies are listed 'Best First'.
Re^3: Permuting with duplicates and no memory (off by 1)
by tye (Sage) on Apr 02, 2007 at 03:11 UTC

Just FYI, perhaps you missed this bit from the root node:

```do {
print "@ARGV\n";
} while( nextPermut­e(@ARGV) );

which is also why I called my routine "nextPermute".

Also note that dragonchild's and my iterators can be reused. For yours to be reusable you probably want to change:

```      return if \$i == -1;

to

```      if(  \$i == -1  ) {
\$first= 1;
return;
}

- tye

Create A New User
Node Status?
node history
Node Type: note [id://607704]
help
Chatterbox?
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others contemplating the Monastery: (6)
As of 2017-08-18 11:18 GMT
Sections?
Information?
Find Nodes?
Leftovers?
Voting Booth?
Who is your favorite scientist and why?

Results (299 votes). Check out past polls.

Notices?