# Computer scientists love the Fibonacci sequence
# [https://en.wikipedia.org/wiki/Fibonacci_sequence], possibly
# described by Acharya Pingala in छन्दःशास्त्र (Chhandaḥśāstra).
#
# The basic definition is that the next item in the sequence
# if the sum of the two preceding items, and the two initial
# items and 0 and 1.
#
# We end up with [0, 1, 1, 2, 3, 5, 8, 13, ...]

def fibbo(n):
    match n:
        case 0 | 1:
            return n
        case _:
            return fibbo(n-1) + fibbo(n-2)

# For example: the first few items in the sequence:
for n in range(36):
    print(n, fibbo(n))

# A (nowadays) less commonly used way to construct the mapping
# from n to fibbo(n) is to use the map function.
# map returns a generator, and we call list to collect the numbers:
sequence = list(map(fibbo, range(36)))
print(sequence)

# To split the work between multiple Python processes, we can
# use the multiprocessing module:
import multiprocessing

pool = multiprocessing.Pool()
sequence = pool.map(fibbo, range(36))
print(sequence)

# We may use 'with' to clean up the pool after we're done with
# the workers:
with multiprocessing.Pool(10) as pool:
    sequence = pool.map(fibbo, range(36))
print(sequence)
