Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Fibonacci numbers, with an one-liner in Python 3?

I know there is nothing wrong with writing with proper function structure, but I would like to know how can I find nth fibonacci number with most Pythonic way with a one-line.

I wrote that code, but It didn't seem to me best way:

>>> fib = lambda n:reduce(lambda x, y: (x[0]+x[1], x[0]), [(1,1)]*(n-2))[0] >>> fib(8) 13 

How could it be better and simplier?

like image 335
utdemir Avatar asked Feb 08 '11 17:02

utdemir


People also ask

How is 1 a Fibonacci number?

Understanding the Fibonacci Sequence The numbers in the Fibonacci Sequence don't equate to a specific formula, however, the numbers tend to have certain relationships with each other. Each number is equal to the sum of the preceding two numbers. For example, 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377.


2 Answers

fib = lambda n:reduce(lambda x,n:[x[1],x[0]+x[1]], range(n),[0,1])[0] 

(this maintains a tuple mapped from [a,b] to [b,a+b], initialized to [0,1], iterated N times, then takes the first tuple element)

>>> fib(1000) 43466557686937456435688527675040625802564660517371780402481729089536555417949051 89040387984007925516929592259308032263477520968962323987332247116164299644090653 3187938298969649928516003704476137795166849228875L 

(note that in this numbering, fib(0) = 0, fib(1) = 1, fib(2) = 1, fib(3) = 2, etc.)

(also note: reduce is a builtin in Python 2.7 but not in Python 3; you'd need to execute from functools import reduce in Python 3.)

like image 123
Jason S Avatar answered Oct 08 '22 09:10

Jason S


A rarely seen trick is that a lambda function can refer to itself recursively:

fib = lambda n: n if n < 2 else fib(n-1) + fib(n-2) 

By the way, it's rarely seen because it's confusing, and in this case it is also inefficient. It's much better to write it on multiple lines:

def fibs():     a = 0     b = 1     while True:         yield a         a, b = b, a + b 
like image 41
Mark Byers Avatar answered Oct 08 '22 08:10

Mark Byers