Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
The other day, as an excuse to play around with custom iterators, I created some completely over-engineered code to calculate the Fibonacci sequences. But surely such a simple function can be implemented in fewer than my 15 lines? (Rick Wicklin, who writes the SAS blog The Do Loop, thinks so too.) We could use such a function to more easily show that the ratio of successive Fibonacci numbers tends to the Golden Ratio.
Barry Rowlingson suggests this function to calculate the ratio between the nth and n+1th Fibonacci number:
> fibrat=function(n){a=1;b=1;for(i in 1:n){t=b;b=a;a=a+t};return(a/b)} > fibrat(99) [1] 1.618034
A slight tweak to Barry's code yields a function to calculate the Nth Fibonacci number in 55 characters:
fib=function(n){a=0;b=1;for(i in 1:n){t=b;b=a;a=a+t};a}
I can do it in 1 fewer characters with the closed-form solution:
fib=function(n){g=(1+sqrt(5))/2;(g^n-(1-g)^n)/sqrt(5)}
But given that this equation is written in terms of the Golden Ratio, using it to derive the Golden Ratio pretty much defeats the purpose.
jebyrnes suggests another means of calculating the Golden Ratio from fibonacci numbers, this time using the sapply function:
> fv<-c() > sapply(1:20, function(i) if(i<3){fv[i] <<- 1}else + {fv[i]<<-fv[i-1]+fv[i-2]})[-1]/fv[-length(fv)] [1] 1.000000 2.000000 1.500000 1.666667 1.600000 1.625000 1.615385 1.619048 [9] 1.617647 1.618182 1.617978 1.618056 1.618026 1.618037 1.618033 1.618034 [17] 1.618034 1.618034 1.618034
jebyrnes also pointed me to this page of Fibonacci 1-liners in many languages including C, Java and Python. Unless I'm mistaken, R is now very close to holding the record for shortest 1-liner.
R-bloggers.com offers daily e-mail updates about R news and tutorials about learning R and many other topics. Click here if you're looking to post or find an R/data-science job.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.