#!/usr/bin/perl 
# Usamos el módulo Benchmark para comparar nuestros resultados.
# Noten como al módulo Memoize le puedo pedir que en lugar de
# hacer un alias hacia la nueva función con caché, le cambie el
# nombre, así puedo probar con facilidad.
use strict;
use warnings;

use Benchmark qw(cmpthese);
use Memoize;
memoize 'fib', INSTALL => 'memo_fib';

sub fib {
  my ($n) = @_;
  if ($n < 2) {
    return 1;
  }
  else {
    return fib($n - 1) + fib($n - 2);
  }
}

# Los lados izquierdos son _etiquetas_, pero los lados derechos
# son _clausuras_ sin argumentos que llaman al código en cuestión.
cmpthese( 200000, {
           'sin memo' => 'fib(12)',
           'con memo' => 'memo_fib(12)'
} );