$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; }