repellent:
Sweet! So of course I had to take another look:
sub pascal_tri_row {
my $r = shift;
return () if $r < 0;
my @row = (1) x ($r + 1);
for my $i (1 .. $r - 1)
{
$row[$_] += $row[$_ - 1]
for reverse 1 .. $i;
}
return @row;
}
sub robo_2 {
my $row = shift;
my @cols = (1);
++$row;
$cols[$_] = $cols[$_-1] * ($row-$_)/$_ for 1 .. $row-1;
return @cols;
}
sub triangle {
my $numTosses = shift;
my @triangle = (0, 1, 0);
for (1 .. $numTosses) {
my @newTriangle=(0);
push @newTriangle, $triangle[$_]+$triangle[$_+1] for 0 .. $#tr
+iangle-1;
push @newTriangle, 0;
@triangle = @newTriangle;
}
return @triangle[1..$#triangle-1];
}
use Benchmark qw(cmpthese);
print "robo_1: ", join(" ",triangle(8)), "\n";
print "repel1: ", join(" ",pascal_tri_row(8)), "\n";
print "robo_2: ", join(" ",robo_2(8)), "\n";
cmpthese -1, {
robo_tri => sub { triangle(32) },
repel_tri => sub { pascal_tri_row(32) },
robo_2 => sub { robo_2(32) },
};
First I put in a trace so I could be sure I wasn't generating useless values. Next, I couldn't bear the zeroes you had to add to your function to match my original return value. They were just sentinel values to simplify the calculation, anyway. So I fixed the original to return only the values of interest. Finally, I had to squeeze a little more speed out of it:
$ perl 892898.pl
robo_1: 1 8 28 56 70 56 28 8 1
repel1: 1 8 28 56 70 56 28 8 1
robo_2: 1 8 28 56 70 56 28 8 1
Rate robo_tri repel_tri robo_2
robo_tri 2196/s -- -42% -93%
repel_tri 3775/s 72% -- -88%
robo_2 31946/s 1355% 746% --
You should've read a bit further down in the wikipedia article you linked. It had a much better algorithm for calculating the coefficients of any row. It saved a nested loop.
;^)
...roboticus
When your only tool is a hammer, all problems look like your thumb.
-
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.