Leonardo numbers
Because Fibonacci numbers are quite abused in programming, a similar concept.
L0 = L1 = 1 Ln = Ln-2 + Ln-1 + 1
My first impulse is to describe them in recursive way:
def leonardo(n): if n in (0, 1): return 1 return leonardo(n - 2) + leonardo(n - 1) + 1 for i in range(NUMBER): print('leonardo[{}] = {}'.format(i, leonardo(i)))
But this is not very efficient to calculate them, as for each is calculating all the previous ones, recursively.
Here memoization works beautifully
cache = {} def leonardo(n): if n in (0, 1): return 1 if n not in cache: result = leonardo(n - 1) + leonardo(n - 2) + 1 cache[n] = result return cache[n] for i in range(NUMBER): print('leonardo[{}] = {}'.format(i, leonardo(i)))
Taking into account that it uses more memory, and that calculating the Nth element without calculating the previous ones is also costly.
I saw this on Programming Praxis, and I like a lot the solution proposed by Graham on the comments, using an iterator.
def leonardo_numbers(): a, b = 1, 1 while True: yield a a, b = b, a + b + 1
The code is really clean.
Pingback: All you need is cache | Wrong Side of Memphis