This goes through the same steps as the functional version but doesn't use much functional programming (and so is probably more efficient):
#!/usr/bin/perl -w
use strict;
sub gen {
my %list;
@list{@_}= map [1], 0..$#_;
return sub {
my @next;
for my $m ( keys %list ) {
if( ! @next || $list{$m}[0] < $list{$next[0]}[0] ) {
@next= $m;
} elsif( $list{$m}[0] == $list{$next[0]}[0] ) {
push @next, $m;
}
}
my $ret= $list{$next[0]}[0];
for my $m ( @next ) {
shift @{$list{$m}};
}
for my $m ( keys %list ) {
push @{$list{$m}}, $ret*$m;
}
return $ret;
};
}
@ARGV= (2,3,5) if ! @ARGV;
my $iter= gen(@ARGV);
print $iter->(), $/ while 1;
Ever notice that converting a functional program to a procedural one is a bit like doing a Fourier transform? (: I supposed I shouldn't be using a closure with such a claim, but they make convenient one-method objects.
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.
|