diff --git a/docs/Fibonacci.rst b/docs/Fibonacci.rst index 3b27d8b..cb6d2d5 100644 --- a/docs/Fibonacci.rst +++ b/docs/Fibonacci.rst @@ -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 @@ -36,7 +38,7 @@ Features >>> from pygorithm.fibonacci import modules >>> modules() - ['cache', 'recursion'] + ['generator', 'goldenratio', 'memoization', 'recursion'] Implementations API ------------------- diff --git a/pygorithm/fibonacci/__init__.py b/pygorithm/fibonacci/__init__.py index e316377..d4cef98 100644 --- a/pygorithm/fibonacci/__init__.py +++ b/pygorithm/fibonacci/__init__.py @@ -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 diff --git a/pygorithm/fibonacci/generator.py b/pygorithm/fibonacci/generator.py new file mode 100644 index 0000000..95b556d --- /dev/null +++ b/pygorithm/fibonacci/generator.py @@ -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) diff --git a/pygorithm/fibonacci/goldenratio.py b/pygorithm/fibonacci/goldenratio.py new file mode 100644 index 0000000..08420d0 --- /dev/null +++ b/pygorithm/fibonacci/goldenratio.py @@ -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) diff --git a/pygorithm/fibonacci/cache.py b/pygorithm/fibonacci/memoization.py similarity index 92% rename from pygorithm/fibonacci/cache.py rename to pygorithm/fibonacci/memoization.py index 1bda6b5..ce6ce40 100644 --- a/pygorithm/fibonacci/cache.py +++ b/pygorithm/fibonacci/memoization.py @@ -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. diff --git a/pygorithm/fibonacci/modules.py b/pygorithm/fibonacci/modules.py index 820ce4f..3ec1157 100644 --- a/pygorithm/fibonacci/modules.py +++ b/pygorithm/fibonacci/modules.py @@ -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 diff --git a/pygorithm/fibonacci/recursion.py b/pygorithm/fibonacci/recursion.py index fa37560..a0c3451 100644 --- a/pygorithm/fibonacci/recursion.py +++ b/pygorithm/fibonacci/recursion.py @@ -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)] diff --git a/tests/test_fibonacci.py b/tests/test_fibonacci.py index afbf712..f2dbb15 100644 --- a/tests/test_fibonacci.py +++ b/tests/test_fibonacci.py @@ -4,7 +4,7 @@ import unittest -from pygorithm.fibonacci import cache, recursion +from pygorithm.fibonacci import generator, goldenratio, memoization, recursion class TestFibonacciImplementations(unittest.TestCase): @@ -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)