Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions docs/Fibonacci.rst
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,10 @@ Features
--------

* Fibonacci implementations available:
- Generator
- Golden ratio
- Memorization (which saves some recursions to avoid computation of same series again and again)
- Recursion
- Cache (which saves some recursions to avoid computation of same series again and again)

* Get the code used for any of the implementation

Expand All @@ -36,7 +38,7 @@ Features

>>> from pygorithm.fibonacci import modules
>>> modules()
['cache', 'recursion']
['generator', 'goldenratio', 'memoization', 'recursion']

Implementations API
-------------------
Expand Down
6 changes: 4 additions & 2 deletions pygorithm/fibonacci/__init__.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
from pygorithm.fibonacci import cache
from pygorithm.fibonacci import generator
from pygorithm.fibonacci import goldenratio
from pygorithm.fibonacci import memoization
from pygorithm.fibonacci.modules import modules
from pygorithm.fibonacci import recursion
from . modules import modules
40 changes: 40 additions & 0 deletions pygorithm/fibonacci/generator.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
"""
Fibonacci implementation through generator.
"""

import inspect


def get_sequence(n):
"""
Return Fibonacci sequence from zero to specified number as list.
"""
def fib():
"""
Return Fibonacci value by specified number as integer.

Golden ratio — https://en.wikipedia.org/wiki/Golden_ratio
Fibonacci's relation to the golden ratio — https://en.wikipedia.org/wiki/Fibonacci_number#Closed-form_expression
"""
a, b = 0, 1

while True:
yield a

a, b = b, a + b

def sequence(n):
"""
Return sequence of Fibonacci values as list.
"""
f = fib()
return [f.__next__() for _ in range(n + 1)]

return sequence(n)


def get_code():
"""
Return source code of Fibonacci sequence logic's implementation.
"""
return inspect.getsource(get_sequence)
39 changes: 39 additions & 0 deletions pygorithm/fibonacci/goldenratio.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
"""
Fibonacci implementation through golden ratio (math formula).
"""

import inspect
import math


def get_sequence(n):
"""
Return Fibonacci sequence from zero to specified number as list.
"""
def fib(n):
"""
Return Fibonacci value by specified number as integer.

Golden ratio — https://en.wikipedia.org/wiki/Golden_ratio
Fibonacci's relation to the golden ratio — https://en.wikipedia.org/wiki/Fibonacci_number#Closed-form_expression
"""
golden_ratio = (1 + math.sqrt(5)) / 2

val = (golden_ratio ** n - (1 - golden_ratio) ** n) / math.sqrt(5)

return int(val)

def sequence(n):
"""
Return sequence of Fibonacci values as list.
"""
return [fib(value) for value in range(n + 1)]

return sequence(n)


def get_code():
"""
Return source code of Fibonacci sequence logic's implementation.
"""
return inspect.getsource(get_sequence)
Original file line number Diff line number Diff line change
Expand Up @@ -24,12 +24,13 @@ def fib(n):

def sequence(n):
"""
Return sequence if Fibonacci values as list.
Return sequence of Fibonacci values as list.
"""
return [fib(value) for value in range(n + 1)]

return sequence(n)


def get_code():
"""
Return source code of Fibonacci sequence logic's implementation.
Expand Down
21 changes: 14 additions & 7 deletions pygorithm/fibonacci/modules.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,20 @@
"""
Find all modules in Fibonacci logic.
"""

import pkgutil

import pygorithm.fibonacci


def modules():
"""
Find all functions in pygorithm.data_structures
Find all functions in `pygorithm.fibonacci`.
"""
import pygorithm.fibonacci
package = pygorithm.fibonacci
modules = []
for importer, modname, ispkg in pkgutil.iter_modules(package.__path__):
modules.append(modname)
modules.remove('modules')
modules.sort()

modules = sorted([
modname for _, modname, __ in pkgutil.iter_modules(package.__path__) if modname != 'modules'
])

return modules
9 changes: 3 additions & 6 deletions pygorithm/fibonacci/recursion.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,17 +13,14 @@ def fib(n):
"""
Return Fibonacci value by specified number as integer.
"""
if n == 0:
return 0

if n == 1:
return 1
if n <= 1:
return n

return fib(n - 1) + fib(n - 2)

def sequence(n):
"""
Return sequence if Fibonacci values as list.
Return sequence of Fibonacci values as list.
"""
return [fib(value) for value in range(n + 1)]

Expand Down
4 changes: 2 additions & 2 deletions tests/test_fibonacci.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

import unittest

from pygorithm.fibonacci import cache, recursion
from pygorithm.fibonacci import generator, goldenratio, memoization, recursion


class TestFibonacciImplementations(unittest.TestCase):
Expand All @@ -16,7 +16,7 @@ def test_implementations_same_result(self):
"""
Verify that all implementations have same result.
"""
fibonacci_implementations = [cache, recursion]
fibonacci_implementations = [generator, goldenratio, memoization, recursion]

for implementation in fibonacci_implementations:
result = getattr(implementation, 'get_sequence')(0)
Expand Down