From 4761fef1a5a3904167285af8819091018c8e04b1 Mon Sep 17 00:00:00 2001 From: jonabtc <39396756+jonabtc@users.noreply.github.com> Date: Sat, 18 Sep 2021 20:22:47 -0500 Subject: [PATCH] Double factorial iterative (#4760) * Adding the double factorial algorithm * Adding the double factorial algorithm Co-authored-by: Jonathan Ocles --- maths/double_factorial_iterative.py | 33 +++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 maths/double_factorial_iterative.py diff --git a/maths/double_factorial_iterative.py b/maths/double_factorial_iterative.py new file mode 100644 index 000000000..b2b58aa04 --- /dev/null +++ b/maths/double_factorial_iterative.py @@ -0,0 +1,33 @@ +def double_factorial(num: int) -> int: + """ + Compute double factorial using iterative method. + + 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(num, int): + raise ValueError("double_factorial() only accepts integral values") + if num < 0: + raise ValueError("double_factorial() not defined for negative values") + value = 1 + for i in range(num, 0, -2): + value *= i + return value + + +if __name__ == "__main__": + import doctest + + doctest.testmod()