#!/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";
}