aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Hamlin <1197072+myrrhlin@users.noreply.github.com>2019-07-16 22:45:38 -0400
committerMichael Hamlin <1197072+myrrhlin@users.noreply.github.com>2019-07-18 10:27:11 -0400
commit45c08f99aa00713944a4c145a37d289897b0b537 (patch)
tree66ac7f2bd5a5bb3a160c1513064d8a86d0440c75
parent03ac841beabdc070b314c7b0e6765cd82bfae8c2 (diff)
downloadperlweeklychallenge-club-45c08f99aa00713944a4c145a37d289897b0b537.tar.gz
perlweeklychallenge-club-45c08f99aa00713944a4c145a37d289897b0b537.tar.bz2
perlweeklychallenge-club-45c08f99aa00713944a4c145a37d289897b0b537.zip
remember previous evaluations
which avoids a lot of calls. previously: A( 3, 10 ) = 8189 ...after 44698325 calls. becomes: A( 3, 10 ) = 8189 ...after 24584 calls.
-rw-r--r--challenge-017/michael-hamlin/perl5/t1-ackermann-simple.pl12
1 files changed, 6 insertions, 6 deletions
diff --git a/challenge-017/michael-hamlin/perl5/t1-ackermann-simple.pl b/challenge-017/michael-hamlin/perl5/t1-ackermann-simple.pl
index 02e03a644f..406fe6073e 100644
--- a/challenge-017/michael-hamlin/perl5/t1-ackermann-simple.pl
+++ b/challenge-017/michael-hamlin/perl5/t1-ackermann-simple.pl
@@ -15,13 +15,13 @@ no warnings 'recursion';
my $count = 0;
sub _ack( $m, $n ) {
+ state @known;
$count++;
- if ($m > 0) {
- return _ack( $m - 1, 1 ) unless $n;
- return _ack( $m - 1, _ack( $m, $n - 1));
- } else {
- return $n + 1;
- }
+ return $known[$m][$n] ||= do {
+ !$m ? $n + 1 :
+ !$n ? _ack($m - 1, 1) :
+ _ack($m - 1, _ack($m, $n - 1));
+ };
}
sub ack ( $m, $n ) {
die "the function is not defined for negative parameters" if $m < 0 || $n < 0;