commit 5d8dca56e3a8940449cef3beb5d573bbcc7bd5e0 Author: nicolas Date: Sat May 2 20:11:05 2020 -0300 Added code and a few test cases diff --git a/README.md b/README.md new file mode 100644 index 0000000..e3e8aaf --- /dev/null +++ b/README.md @@ -0,0 +1,58 @@ +Fibonacci +== + +The simple recursion: + +``` +fib(0) = 0 +fib(1) = 1 +fib(n) = fib(n - 1) + fib(n - 2) +``` + +e.g.: +``` +fib(4) = [fib(3)] + [fib(2)] = [fib(2) + fib(1)] + [fib(1) + fib(0)] = [(fib(1) + fib(0)) + 1] + [1 + 0] = 3 +``` + +With this approach we have to repeat a lot of calculations. + +With dynamic programming techniques we only calculate each value one time. + + +Execution use cases +== + +``` +Calculating Fibonacci of 10 recursively took 2.508100033082883e-05 seconds. +Calculating Fibonacci of 10 with dynamic programming took 7.996000022103544e-06 seconds. +``` + +``` +Calculating Fibonacci of 20 recursively took 0.0030608279998887156 seconds. +Calculating Fibonacci of 20 with dynamic programming took 2.0420000055310084e-05 seconds. +``` + +``` +Calculating Fibonacci of 30 recursively took 0.2475134070000422 seconds. +Calculating Fibonacci of 30 with dynamic programming took 1.4527999610436382e-05 seconds. +``` + +``` +Calculating Fibonacci of 35 recursively took 2.728477938999731 seconds. +Calculating Fibonacci of 35 with dynamic programming took 1.7669000044406857e-05 seconds. +``` + +``` +Calculating Fibonacci of 38 recursively took 11.392906241000219 seconds. +Calculating Fibonacci of 38 with dynamic programming took 1.8928999907075195e-05 seconds. +``` + +``` +Calculating Fibonacci of 40 recursively took 34.496809830000075 seconds. +Calculating Fibonacci of 40 with dynamic programming took 2.2804999844083795e-05 seconds. +``` + +``` +Calculating Fibonacci of 45 recursively took 367.38581775700004 seconds. +Calculating Fibonacci of 45 with dynamic programming took 2.579200008767657e-05 seconds. +``` diff --git a/fibonacci.py b/fibonacci.py new file mode 100644 index 0000000..5bed0c8 --- /dev/null +++ b/fibonacci.py @@ -0,0 +1,43 @@ +import functools, timeit + +def fibo_rec(num): + if num == 0: + return 0 + elif num == 1: + return 1 + else: + return fibo_rec(num - 1) + fibo_rec(num - 2) + + +def fibonacci_dp(num, table): + if table[num] >= 0: + return table[num] + + if (num == 0 or num == 1): + res = num + else: + res = fibonacci_dp(num - 1, table) + fibonacci_dp(num - 2, table) + + table[num] = res + + return res + + +def fibo_dp(num): + table = [-1] * (num + 1) + return fibonacci_dp(num, table) + + +number = int(input('Enter a number: ')) + + +recursive_timer = timeit.Timer(functools.partial(fibo_rec, number)) +recursive_time = recursive_timer.timeit(1) +print(f'Calculating Fibonacci of {number} recursively took {recursive_time} seconds.') + +dp_timer = timeit.Timer(functools.partial(fibo_dp, number)) +dp_time = dp_timer.timeit(1) +print(f'Calculating Fibonacci of {number} with dynamic programming took {dp_time} seconds.') + + +