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...