{ use vars qw( @cache @n ) }
{@cache = (0, 1)}
sub fib {
{push @n, shift}
{return pop @n if $n[-1] < 2}
{$cache [$n[-1]] ||= fib ($n[-1] - 1) + fib ($n[-1] - 2)}
{return $cache[pop @n]}
}
Bonus: Doesn't confine you to the main namespace!
Now if we could only localize variables, we wouldn't need to manage our own stack.
{ use vars qw( @cache ) }
{@cache = (0, 1)}
sub fib {
(local (our $n = shift)) && do {
{return $n if $n < 2}
{$cache[$n] ||= fib ($n - 1) + fib ($n - 2)}
{return $cache[$n]}
}
}
Bonus: Don't have to use use vars except for globals!
By the way, the body simplifies down to a single expression, and your cache initialiser is not needed.
{ use vars qw( @cache ) }
sub fib {
(local (our $n) = shift), (
$n < 2 ? $n : $cache[$n] ||= fib ($n - 1) + fib ($n - 2)
)
}
Update: Replaced buggy
(local our $n = shift) && ...
with
(local (our $n) = shift) && ...
|