From 814750e637ff3a28442808dc10b2c23170abc85b Mon Sep 17 00:00:00 2001 From: Du YuanChao Date: Thu, 31 Oct 2019 20:45:32 +0800 Subject: [PATCH] update factorial (#1535) * update factorial * update factorial --- maths/factorial_python.py | 43 +++++++++++++++++++++++------------- maths/factorial_recursive.py | 36 +++++++++++++++++++++--------- 2 files changed, 54 insertions(+), 25 deletions(-) diff --git a/maths/factorial_python.py b/maths/factorial_python.py index ab97cd41e..b9adfdbae 100644 --- a/maths/factorial_python.py +++ b/maths/factorial_python.py @@ -1,21 +1,34 @@ def factorial(input_number: int) -> int: """ - Non-recursive algorithm of finding factorial of the - input number. - >>> factorial(1) - 1 - >>> factorial(6) - 720 - >>> factorial(0) - 1 + Calculate the factorial of specified number + + >>> factorial(1) + 1 + >>> factorial(6) + 720 + >>> factorial(0) + 1 + >>> factorial(-1) + Traceback (most recent call last): + ... + ValueError: factorial() not defined for negative values + >>> factorial(0.1) + Traceback (most recent call last): + ... + ValueError: factorial() only accepts integral values """ if input_number < 0: - raise ValueError("Input input_number should be non-negative") - elif input_number == 0: - return 1 - else: - result = 1 - for i in range(input_number): - result = result * (i + 1) + raise ValueError("factorial() not defined for negative values") + if not isinstance(input_number, int): + raise ValueError("factorial() only accepts integral values") + result = 1 + for i in range(1, input_number): + result = result * (i + 1) return result + + +if __name__ == '__main__': + import doctest + + doctest.testmod() diff --git a/maths/factorial_recursive.py b/maths/factorial_recursive.py index f346c65f1..013560b28 100644 --- a/maths/factorial_recursive.py +++ b/maths/factorial_recursive.py @@ -1,14 +1,30 @@ -def fact(n): +def factorial(n: int) -> int: """ - Return 1, if n is 1 or below, - otherwise, return n * fact(n-1). + Calculate the factorial of specified number + + >>> factorial(1) + 1 + >>> factorial(6) + 720 + >>> factorial(0) + 1 + >>> factorial(-1) + Traceback (most recent call last): + ... + ValueError: factorial() not defined for negative values + >>> factorial(0.1) + Traceback (most recent call last): + ... + ValueError: factorial() only accepts integral values """ - return 1 if n <= 1 else n * fact(n - 1) + if n < 0: + raise ValueError("factorial() not defined for negative values") + if not isinstance(n, int): + raise ValueError("factorial() only accepts integral values") + return 1 if n == 0 or n == 1 else n * factorial(n - 1) -""" -Show factorial for i, -where i ranges from 1 to 20. -""" -for i in range(1, 21): - print(i, ": ", fact(i), sep="") +if __name__ == '__main__': + import doctest + + doctest.testmod()