#!/usr/bin/perl -w use strict; use Benchmark qw/:all/; my $iGlobal; my $x = 4; timethese (1000000, { 'Recursion' => 'Rfactorial(30)', 'Global' => 'Gfactorial(30)', 'Lexical' => 'Lfactorial(30)', 'Closure' => '&{Cfactorial()}(30)', } ); # A classic, recursive soulution. sub Rfactorial { my $i = shift; return 1 if $i == 0; return 1 if $i == 1; return $i * Rfactorial($i - 1); } # Rewritten to use global variables. sub Gfactorial { $iGlobal = shift; return 1 unless $iGlobal > 1; my $result = 1; while ($iGlobal > 1) { $result = $result * $iGlobal; $iGlobal--; } return $result; } # expressed with lexicals sub Lfactorial { my $iLexical = shift; return 1 unless $iLexical > 1; my $result = 1; while ($iLexical > 1) { $result = $result * $iLexical; $iLexical--; } return $result; } # Rewritten to use closures sub Cfactorial { my $iClosure; return sub { my $iClosure = shift; my $result = 1; while ($iClosure > 1) { $result = $result * $iClosure; $iClosure --; } return $result; } }