Manual cache
sub fib_cache {
state @fib_cache;
my ($n) = @_;
if ($n < @fib_cache) {
return $fib_cache[$n];
}
if ($n > 1) {
$fib_cache[$n] = fib_cache($n - 1)
+ fib_cache($n - 2);
}
else {
if ($n) {
fib_cache(0);
}
$fib_cache[$n] = $n;
}
return $fib_cache[$n];
}