$a=sqrt 5;print+(((1+$a)/2)**$_-((1-$a)/2)**$_)/$a,$/for 0..73
# For comparison, here is the result of the golfing
# that Tilly and I participated in earlier:
$a=1;print$a-=$b+=$a*=-1,$/for 0..73
####
Benchmark: timing 100000 iterations of Binet, Golf...
Binet: 1 wallclock secs ( 0.70 usr + 0.00 sys = 0.70 CPU) @ 142653.35/s (n=100000)
Golf: 5 wallclock secs ( 4.75 usr + 0.00 sys = 4.75 CPU) @ 21065.94/s (n=100000)
####
Recursive: 118 wallclock secs (116.37 usr + 0.00 sys = 116.37 CPU) @ 0.09/s (n=10)
####
#!perl -w
use strict;
use Benchmark;
# Fibonnaci Number to calculate.
use vars ('$n'); # Make it global, but appease strict.
$n = 30;
my $iter = 100_000;
timethese( $iter, {
Binet => '&FibBinet($n)',
Golf => '&FibGolf($n)',
# Recursive => '&FibRecursive($n)',
});
sub FibRecursive
{
my $index = shift;
return 0 if 0 == $index;
return 1 if 1 == $index;
return FibRecursive( $index - 1 ) + FibRecursive( $index - 2 );
}
sub FibGolf
{
my $index = shift;
my $acc = 1;
my $tmp;
while( $index-- )
{
$acc-=$tmp+=$acc*=-1;
}
return $acc;
}
sub FibBinet
{
my $index = shift;
my $root5 = sqrt 5;
return ( ( ( 1 + $root5 ) / 2 ) ** $index
- ( ( 1 - $root5 ) / 2 ) ** $index ) / $root5;
}