diff --git a/dynamic_programming/fibonacci.py b/dynamic_programming/fibonacci.py index cab1358ddea1..4abc60d4f3cc 100644 --- a/dynamic_programming/fibonacci.py +++ b/dynamic_programming/fibonacci.py @@ -5,61 +5,48 @@ class Fibonacci: - def __init__(self, N=None): - self.fib_array = [] - if N: - N = int(N) - self.fib_array.append(0) - self.fib_array.append(1) - for i in range(2, N + 1): - self.fib_array.append(self.fib_array[i - 1] + self.fib_array[i - 2]) - elif N == 0: - self.fib_array.append(0) - print(self.fib_array) + def __init__(self) -> None: + self.sequence = [0, 1] - def get(self, sequence_no=None): + def get(self, index: int) -> list: """ - >>> Fibonacci(5).get(3) - [0, 1, 1, 2, 3, 5] - [0, 1, 1, 2] - >>> Fibonacci(5).get(6) - [0, 1, 1, 2, 3, 5] - Out of bound. - >>> Fibonacci(5).get(-1) - [0, 1, 1, 2, 3, 5] - [] + Get the Fibonacci number of `index`. If the number does not exist, + calculate all missing numbers leading up to the number of `index`. + + >>> Fibonacci().get(10) + [0, 1, 1, 2, 3, 5, 8, 13, 21, 34] + >>> Fibonacci().get(5) + [0, 1, 1, 2, 3] """ - if sequence_no is not None: - if sequence_no < len(self.fib_array): - return print(self.fib_array[: sequence_no + 1]) - else: - print("Out of bound.") - else: - print("Please specify a value") + difference = index - (len(self.sequence) - 2) + if difference >= 1: + for _ in range(difference): + self.sequence.append(self.sequence[-1] + self.sequence[-2]) + return self.sequence[:index] -if __name__ == "__main__": - print("\n********* Fibonacci Series Using Dynamic Programming ************\n") - print("\n Enter the upper limit for the fibonacci sequence: ", end="") - try: - N = int(input().strip()) - fib = Fibonacci(N) - print( - "\n********* Enter different values to get the corresponding fibonacci " - "sequence, enter any negative number to exit. ************\n" - ) - while True: - try: - i = int(input("Enter value: ").strip()) - if i < 0: - print("\n********* Good Bye!! ************\n") - break - fib.get(i) - except NameError: - print("\nInvalid input, please try again.") - except NameError: - print("\n********* Invalid input, good bye!! ************\n") +def main(): + print( + "Fibonacci Series Using Dynamic Programming\n", + "Enter the index of the Fibonacci number you want to calculate ", + "in the prompt below. (To exit enter exit or Ctrl-C)\n", + sep="", + ) + fibonacci = Fibonacci() + + while True: + prompt: str = input(">> ") + if prompt in {"exit", "quit"}: + break - import doctest + try: + index: int = int(prompt) + except ValueError: + print("Enter a number or 'exit'") + continue - doctest.testmod() + print(fibonacci.get(index)) + + +if __name__ == "__main__": + main()