From 5957eabd3e0c92650dba0962779b8729d2875209 Mon Sep 17 00:00:00 2001 From: jonabtc <39396756+jonabtc@users.noreply.github.com> Date: Tue, 3 Aug 2021 01:03:22 -0500 Subject: [PATCH] Adding the double factorial algorithm (#4550) --- maths/double_factorial_recursive.py | 31 +++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 maths/double_factorial_recursive.py diff --git a/maths/double_factorial_recursive.py b/maths/double_factorial_recursive.py new file mode 100644 index 000000000..05c9b2968 --- /dev/null +++ b/maths/double_factorial_recursive.py @@ -0,0 +1,31 @@ +def double_factorial(n: int) -> int: + """ + Compute double factorial using recursive method. + Recursion can be costly for large numbers. + + To learn about the theory behind this algorithm: + https://en.wikipedia.org/wiki/Double_factorial + + >>> import math + >>> all(double_factorial(i) == math.prod(range(i, 0, -2)) for i in range(20)) + True + >>> double_factorial(0.1) + Traceback (most recent call last): + ... + ValueError: double_factorial() only accepts integral values + >>> double_factorial(-1) + Traceback (most recent call last): + ... + ValueError: double_factorial() not defined for negative values + """ + if not isinstance(n, int): + raise ValueError("double_factorial() only accepts integral values") + if n < 0: + raise ValueError("double_factorial() not defined for negative values") + return 1 if n <= 1 else n * double_factorial(n - 2) + + +if __name__ == "__main__": + import doctest + + doctest.testmod()