Skip to content

Commit bfa97f9

Browse files
authored
fix-factorial-validation: Fix input validation and doctests
Fix factorial() input validation to use isinstance(number, int) instead of value comparison Changes: - Replace 'number != int(number)' with 'not isinstance(number, int)' in factorial() - Fix doctests in factorial_recursive() to reference factorial_recursive() instead of factorial() - Add negative test case for factorial(1.5) to verify non-integer rejection This ensures consistent input validation between factorial() and factorial_recursive() functions.
1 parent e2a78d4 commit bfa97f9

File tree

1 file changed

+12
-14
lines changed

1 file changed

+12
-14
lines changed

maths/factorial.py

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,20 @@
11
"""
22
Factorial of a positive integer -- https://en.wikipedia.org/wiki/Factorial
33
"""
4-
5-
64
def factorial(number: int) -> int:
75
"""
86
Calculate the factorial of specified number (n!).
9-
107
>>> import math
118
>>> all(factorial(i) == math.factorial(i) for i in range(20))
129
True
1310
>>> factorial(0.1)
1411
Traceback (most recent call last):
1512
...
1613
ValueError: factorial() only accepts integral values
14+
>>> factorial(1.5)
15+
Traceback (most recent call last):
16+
...
17+
ValueError: factorial() only accepts integral values
1718
>>> factorial(-1)
1819
Traceback (most recent call last):
1920
...
@@ -25,29 +26,30 @@ def factorial(number: int) -> int:
2526
>>> factorial(0)
2627
1
2728
"""
28-
if number != int(number):
29+
if not isinstance(number, int):
2930
raise ValueError("factorial() only accepts integral values")
3031
if number < 0:
3132
raise ValueError("factorial() not defined for negative values")
3233
value = 1
3334
for i in range(1, number + 1):
3435
value *= i
3536
return value
36-
37-
3837
def factorial_recursive(n: int) -> int:
3938
"""
4039
Calculate the factorial of a positive integer
4140
https://en.wikipedia.org/wiki/Factorial
42-
4341
>>> import math
44-
>>> all(factorial(i) == math.factorial(i) for i in range(20))
42+
>>> all(factorial_recursive(i) == math.factorial(i) for i in range(20))
4543
True
46-
>>> factorial(0.1)
44+
>>> factorial_recursive(0.1)
4745
Traceback (most recent call last):
4846
...
4947
ValueError: factorial() only accepts integral values
50-
>>> factorial(-1)
48+
>>> factorial_recursive(1.5)
49+
Traceback (most recent call last):
50+
...
51+
ValueError: factorial() only accepts integral values
52+
>>> factorial_recursive(-1)
5153
Traceback (most recent call last):
5254
...
5355
ValueError: factorial() not defined for negative values
@@ -57,12 +59,8 @@ def factorial_recursive(n: int) -> int:
5759
if n < 0:
5860
raise ValueError("factorial() not defined for negative values")
5961
return 1 if n in {0, 1} else n * factorial_recursive(n - 1)
60-
61-
6262
if __name__ == "__main__":
6363
import doctest
64-
6564
doctest.testmod()
66-
6765
n = int(input("Enter a positive integer: ").strip() or 0)
6866
print(f"factorial{n} is {factorial(n)}")

0 commit comments

Comments
 (0)