#!/usr/bin/perl
use strict;
sub fib {
my $n = shift;
return 1 if $n eq 1 || $n eq 2;
fib($n-1) + fib($n-2);
}
sub cached {
my $f = shift;
my @cache;
return sub {
my $p = shift;
return $cache[$p] if defined $cache[$p];
return $cache[$p] = $f->($p);
}
}
my $ffib = cached(\&fib);
*fib = $ffib;
while (42) {
print "n = ";
my $n = <>; chomp($n);
last unless $n;
print "ffib($n) = ", fib($n),"\n";
}