Advent Calendar 2021
| Day 15 | Day 16 | Day 17 |
The gift is presented by Jaldhar H. Vyas. Today he is talking about his solution to “The Weekly Challenge - 108”. This is re-produced for Advent Calendar 2021 from the original post by Jaldhar H. Vyas
.
Task #2: Bell Numbers
Write a script to display top 10 Bell Numbers
. Please refer to wikipedia page for more information.
Ugh maths again. Not being able to make head nor tail of the referenced wikipedia page, I googled around and found this page. The code below is a Raku
translation of the C++
example provided there.
sub bellNumber(Int $n) {
my @bell;
@bell[0][0] = 1;
for 1 .. $n -> $i {
@bell[$i][0] = @bell[$i - 1][$i - 1];
for 1 .. $i -> $j {
@bell[$i][$j] = @bell[$i - 1][$j - 1] + @bell[$i][$j - 1];
}
}
return @bell[$n][0];
}
Basically we are creating what’s known as a Bell Triangle
by starting with a known value (1 for a set with 0 elements) and using dynamic programming to calculate succeeding values. The leftmost value in the $nth row
of the triangle is the Bell number
for $n
.
This is the same thing in Perl
:
sub bellNumber {
my ($n) = @_;
my @bell;
$bell[0][0] = 1;
for my $i (1 .. $n) {
$bell[$i][0] = $bell[$i - 1][$i - 1];
for my $j (1 .. $i) {
$bell[$i][$j] = $bell[$i - 1][$j - 1] + $bell[$i][$j - 1];
}
}
return $bell[$n][0];
}
The spec asks for the “top ten” Bell numbers by which I assume the first ten is meant. In case you are curious, they are:
1 1 2 5 15 52 203 877 4140 21147
If you have any suggestion then please do share with us perlweeklychallenge@yahoo.com.