Hey kiat,
I noticed that your algorithm skips the "1 1" row. I made some changes to fix that bug:
sub pascal {
my ($rows) = @_;
print "1\n";
for (my $outer = 1; $outer < $rows; $outer++) {
my $inner = $outer;
print "1";
for ($i = 1; $i < $inner; $i++) {
my $denominator = factorial($i)*(factorial($inner-$i));
my $pascalnum = factorial($inner)/$denominator if ($denominator
+!= 0);
print " $pascalnum" if ($outer > 1);
}
print " 1\n";
}
}
I also think that using the Binomial Theorem when printing out an entire Pascal's triangle is inefficient. I would rather add numbers from the previous row, as this is much, much faster for large numbers of rows. So I wrote up some code to do this:
sub ton_pascal
{
my $rows = shift;
my $last_row = [ ];
my $this_row = [ 1 ];
last unless ($rows > 0);
print "1\n";
for (my $i = 1; $i < $rows; ++$i) {
$last_row = $this_row;
$this_row = [ 1 ];
for (my $j = 1; $j < $i; $j++) {
push(@$this_row, $last_row->[$j - 1] + $last_row->[$j]);
}
push(@$this_row, 1);
print join(' ', @$this_row) . "\n";
}
}
I'm using array references instead of arrays for extra speed (when we copy the results of $this_row into $last_row), but the references could be removed without affecting the algorithm.
Hope this was helpful... I had fun coding up ton_pascal, so thanks for the problem!
-Ton
-----
Be bloody, bold, and resolute; laugh to scorn
The power of man...
-
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.