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()