From 45c08f99aa00713944a4c145a37d289897b0b537 Mon Sep 17 00:00:00 2001 From: Michael Hamlin <1197072+myrrhlin@users.noreply.github.com> Date: Tue, 16 Jul 2019 22:45:38 -0400 Subject: 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. --- challenge-017/michael-hamlin/perl5/t1-ackermann-simple.pl | 12 ++++++------ 1 file 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; -- cgit