Hey, pretty cool. I thought there was a direct formula but I was unable to find it on my first attempt (and so moved on.) So using Binet's formula we could do:
$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
Unfortunatly, Computers have a hard time with irrational numbers (like sqrt of 5) so this results in things like 75025.0000000001 which is ok for our purposes... but if you ever use this you might want to pass it through int.

In case you were wondering, 73 is an arbitrary stopping place. I picked it because Fib(74) is too big a number for Perl, and results in the scientific notation: 1.30496954492866e+015 which just isn't as much fun.

Update: Of course, what we really need is a benchmark! So here is the output:

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.9 +4/s (n=100000)
And that's just for Fib(30)! I also tried benchmarking the recursive version... hahahaha. So that it wouldn't take all day I dropped the count down to 10 iterations... still Fib(30) though.
Recursive: 118 wallclock secs (116.37 usr + 0.00 sys = 116.37 CPU) @ + 0.09/s (n=10)
No Benchmark post is truly complete with out the code used:
#!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; }

In reply to RE: RE: Fibonnaci by Adam
in thread Reaped: Fibonnaci by NodeReaper

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.