Here's a variation on the theme. The difference is
that this version doesn't change @row
using pushes. It's going to be sized right the first
time.
sub pascal {
my @row = (0) x $_ [0];
$row [0] = 1;
foreach (1 .. shift) {
print "@row[0 .. $_ - 1]\n";
$row [$_] += $row [$_ - 1] for reverse 1 .. @row;
}
}
Abigail
| [reply] [d/l] [select] |
Maybe we can add space padding to your function :)
sub pascal {
my $max = shift or return;
my @row = (0) x $max;
$row[0] = 1;
foreach (1 .. $max) {
print " " x ($max - $_),"@row[0 .. $_ - 1]\n";
$row[$_] += $row[$_ - 1] for reverse 1 .. @row;
}
}
| [reply] [d/l] |
Hello! Abigail-II,
I like your smaller function (it's really elegant) but I don't understand how it works, even though it's only a few lines. Could you explain the parts to me?
Thanks in anticipation :)
kiat
| [reply] |
It's not hard to see how it works. First thing to realize that one
way of calculating the next line in the triangle is to take the
previous line twice, shift one of the line one position to the right,
and then add the elements piecewise. For instance:
1 3 3 1
1 3 3 1
------------- +
1 4 6 4 1
But if you look carefully, you see that to each element, we add the
element to the left of it, except for the two elements on the far
ends - which will both be one (a "new" 1 on the right, and the one
of the left remains "as is").
And that's how the program works. We first add a new element (with the
push), then for each element, we add the preceding one. We have to
work backwards of course, which is achieved by the reverse.
Abigail
| [reply] [d/l] |