Skip to content

Commit 85db134

Browse files
committed
test: improve test coverage and fix negative exponents in power_using_recursion.py
1 parent 8d1fb26 commit 85db134

File tree

1 file changed

+42
-32
lines changed

1 file changed

+42
-32
lines changed

maths/power_using_recursion.py

Lines changed: 42 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -13,51 +13,61 @@
1313
"""
1414

1515

16-
def power(base: int, exponent: int) -> float:
16+
def power(base: float, exponent: int) -> float:
1717
"""
18-
Calculate the power of a base raised to an exponent.
18+
Calculate the power of a base raised to an exponent using recursion.
1919
20+
Args:
21+
base (int): The base number.
22+
exponent (int): The exponent number.
23+
24+
Returns:
25+
the calculated value of base^exponent || base**exponent
26+
27+
cases:
2028
>>> power(3, 4)
2129
81
2230
>>> power(2, 0)
2331
1
24-
>>> all(power(base, exponent) == pow(base, exponent)
25-
... for base in range(-10, 10) for exponent in range(10))
26-
True
27-
>>> power('a', 1)
28-
'a'
29-
>>> power('a', 2)
30-
Traceback (most recent call last):
31-
...
32-
TypeError: can't multiply sequence by non-int of type 'str'
33-
>>> power('a', 'b')
34-
Traceback (most recent call last):
35-
...
36-
TypeError: unsupported operand type(s) for -: 'str' and 'int'
32+
>>> power(5, 1)
33+
5
3734
>>> power(2, -1)
38-
Traceback (most recent call last):
39-
...
40-
RecursionError: maximum recursion depth exceeded
41-
>>> power(0, 0)
42-
1
43-
>>> power(0, 1)
35+
0.5
36+
>>> power(-2, 3)
37+
-8
38+
>>> power(-2, 2)
39+
4
40+
>>> power(0, 5)
4441
0
45-
>>> power(5,6)
46-
15625
47-
>>> power(23, 12)
48-
21914624432020321
42+
>>> power (0,0)
43+
1
4944
"""
50-
return base * power(base, (exponent - 1)) if exponent else 1
45+
if not isinstance(exponent, int):
46+
raise TypeError("exponent must be an integer")
47+
48+
if exponent == 0:
49+
return 1
50+
if exponent < 0:
51+
return 1 / power(base, -exponent)
52+
return base * power(base, exponent - 1)
5153

5254

5355
if __name__ == "__main__":
5456
from doctest import testmod
5557

5658
testmod()
5759
print("Raise base to the power of exponent using recursion...")
58-
base = int(input("Enter the base: ").strip())
59-
exponent = int(input("Enter the exponent: ").strip())
60-
result = power(base, abs(exponent))
61-
if exponent < 0: # power() does not properly deal w/ negative exponents
62-
result = 1 / result
63-
print(f"{base} to the power of {exponent} is {result}")
60+
try:
61+
base = float(input("Enter the base: ").strip())
62+
exponent = int(input("Enter the exponent: ").strip())
63+
result = power(base, exponent)
64+
print(f"{base} to the power of {exponent} is {result}")
65+
except ValueError as e:
66+
print(f"Invalid input: {e} ")
67+
except TypeError as e:
68+
print(f"error: {e}")
69+
except RecursionError:
70+
print(
71+
"""error: Maximum recursive depth exceeded.
72+
The exponent you might have given as input might have been very large"""
73+
)

0 commit comments

Comments
 (0)