diff options
| author | Michael Hamlin <1197072+myrrhlin@users.noreply.github.com> | 2019-07-16 22:45:38 -0400 |
|---|---|---|
| committer | Michael Hamlin <1197072+myrrhlin@users.noreply.github.com> | 2019-07-18 10:27:11 -0400 |
| commit | 45c08f99aa00713944a4c145a37d289897b0b537 (patch) | |
| tree | 66ac7f2bd5a5bb3a160c1513064d8a86d0440c75 | |
| parent | 03ac841beabdc070b314c7b0e6765cd82bfae8c2 (diff) | |
| download | perlweeklychallenge-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.pl | 12 |
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; |
