diff --git a/maths/lucas_series.py b/maths/lucas_series.py index 22ad893a65671b4ef1a5edb7caecdd2e95f55bf2..02eae8d8c6584e802444680b01335eb433e1034a 100644 --- a/maths/lucas_series.py +++ b/maths/lucas_series.py @@ -1,22 +1,69 @@ -# Lucas Sequence Using Recursion +""" +https://en.wikipedia.org/wiki/Lucas_number +""" -def recur_luc(n): +def recursive_lucas_number(n): """ - >>> recur_luc(1) + Returns the nth lucas number + >>> recursive_lucas_number(1) 1 - >>> recur_luc(0) + >>> recursive_lucas_number(20) + 15127 + >>> recursive_lucas_number(0) 2 + >>> recursive_lucas_number(25) + 167761 + >>> recursive_lucas_number(-1.5) + Traceback (most recent call last): + ... + TypeError: recursive_lucas_number accepts only integer arguments. """ if n == 1: return n if n == 0: return 2 - return recur_luc(n - 1) + recur_luc(n - 2) + if not isinstance(n, int): + raise TypeError("recursive_lucas_number accepts only integer arguments.") + + return recursive_lucas_number(n - 1) + recursive_lucas_number(n - 2) + + +def dynamic_lucas_number(n: int) -> int: + """ + Returns the nth lucas number + >>> dynamic_lucas_number(1) + 1 + >>> dynamic_lucas_number(20) + 15127 + >>> dynamic_lucas_number(0) + 2 + >>> dynamic_lucas_number(25) + 167761 + >>> dynamic_lucas_number(-1.5) + Traceback (most recent call last): + ... + TypeError: dynamic_lucas_number accepts only integer arguments. + """ + if not isinstance(n, int): + raise TypeError("dynamic_lucas_number accepts only integer arguments.") + if n == 0: + return 2 + if n == 1: + return 1 + a, b = 2, 1 + for i in range(n): + a, b = b, a + b + return a if __name__ == "__main__": - limit = int(input("How many terms to include in Lucas series:")) - print("Lucas series:") - for i in range(limit): - print(recur_luc(i)) + from doctest import testmod + + testmod() + n = int(input("Enter the number of terms in lucas series:\n").strip()) + n = int(input("Enter the number of terms in lucas series:\n").strip()) + print("Using recursive function to calculate lucas series:") + print(" ".join(str(recursive_lucas_number(i)) for i in range(n))) + print("\nUsing dynamic function to calculate lucas series:") + print(" ".join(str(dynamic_lucas_number(i)) for i in range(n)))