Skip to content

Instantly share code, notes, and snippets.

@Recursing
Created September 6, 2020 22:03
Show Gist options
  • Save Recursing/0becd5c571bfcaf40229cd9b07b83a09 to your computer and use it in GitHub Desktop.
Save Recursing/0becd5c571bfcaf40229cd9b07b83a09 to your computer and use it in GitHub Desktop.
import itertools
import operator
# https://joelgrus.com/2015/07/07/haskell-style-fibonacci-in-python/
def tee_fibs():
yield 1
yield 1
fibs1, fibs2 = itertools.tee(tee_fibs())
next(fibs2) # Offset fibs2
yield from map(operator.add, fibs1, fibs2)
def walrus_fibs():
yield 1
p = 0
for n in walrus_fibs():
yield p + (p := n)
def zip_prev(it):
prev = next(it)
for cur in it:
yield prev, cur
prev = cur
def fibs_zip_prev():
yield 1
yield 1
yield from itertools.starmap(operator.add, zip_prev(fibs_zip_prev()))
def duplicate(it):
prev = next(it)
def i1():
while True:
yield prev
def i2():
nonlocal prev
for x in it:
prev = x
yield x
return i1(), i2()
def fibs_duplicate():
yield 1
yield 1
i1, i2 = duplicate(fibs_duplicate())
yield from map(operator.add, i1, i2)
def fib_zip():
yield 1
yield 1
other_fibs = fib_zip()
for prev, cur in zip(other_fibs, other_fibs):
yield prev + cur
yield prev + cur + cur
fibgens = [tee_fibs, walrus_fibs, fibs_zip_prev, fibs_duplicate, fib_zip]
for fibgen in fibgens:
print(next(itertools.islice(fibgen(), 100, None)))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment