Skip to content

Commit 1ef07fc

Browse files
committed
feat: Concatenate algorithms
1 parent 0b8f54a commit 1ef07fc

File tree

6 files changed

+46
-46
lines changed

6 files changed

+46
-46
lines changed

maths/double_factorial_iterative.py

Lines changed: 0 additions & 33 deletions
This file was deleted.

maths/double_factorial_recursive.py

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,33 @@
1-
def double_factorial(n: int) -> int:
1+
def double_factorial(num: int) -> int:
2+
"""
3+
Compute double factorial using iterative method.
4+
5+
To learn about the theory behind this algorithm:
6+
https://en.wikipedia.org/wiki/Double_factorial
7+
8+
>>> import math
9+
>>> all(double_factorial(i) == math.prod(range(i, 0, -2)) for i in range(20))
10+
True
11+
>>> double_factorial(0.1)
12+
Traceback (most recent call last):
13+
...
14+
ValueError: double_factorial() only accepts integral values
15+
>>> double_factorial(-1)
16+
Traceback (most recent call last):
17+
...
18+
ValueError: double_factorial() not defined for negative values
19+
"""
20+
if not isinstance(num, int):
21+
raise ValueError("double_factorial() only accepts integral values")
22+
if num < 0:
23+
raise ValueError("double_factorial() not defined for negative values")
24+
value = 1
25+
for i in range(num, 0, -2):
26+
value *= i
27+
return value
28+
29+
30+
def double_factorial_recursive(n: int) -> int:
231
"""
332
Compute double factorial using recursive method.
433
Recursion can be costly for large numbers.
@@ -22,7 +51,7 @@ def double_factorial(n: int) -> int:
2251
raise ValueError("double_factorial() only accepts integral values")
2352
if n < 0:
2453
raise ValueError("double_factorial() not defined for negative values")
25-
return 1 if n <= 1 else n * double_factorial(n - 2)
54+
return 1 if n <= 1 else n * double_factorial_recursive(n - 2)
2655

2756

2857
if __name__ == "__main__":

maths/factorial.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ def factorial(number: int) -> int:
3434
return value
3535

3636

37-
def factorial(n: int) -> int:
37+
def factorial_recursive(n: int) -> int:
3838
"""
3939
Calculate the factorial of a positive integer
4040
https://en.wikipedia.org/wiki/Factorial

maths/find_max.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ def find_max_recursive(nums: list[int | float], left: int, right: int) -> int |
5959
IndexError: list index out of range
6060
"""
6161
if len(nums) == 0:
62-
raise ValueError("find_max() arg is an empty sequence")
62+
raise ValueError("find_max_recursive() arg is an empty sequence")
6363
if (
6464
left >= len(nums)
6565
or left < -len(nums)
@@ -70,8 +70,10 @@ def find_max_recursive(nums: list[int | float], left: int, right: int) -> int |
7070
if left == right:
7171
return nums[left]
7272
mid = (left + right) >> 1 # the middle
73-
left_max = find_max(nums, left, mid) # find max in range[left, mid]
74-
right_max = find_max(nums, mid + 1, right) # find max in range[mid + 1, right]
73+
left_max = find_max_recursive(nums, left, mid) # find max in range[left, mid]
74+
right_max = find_max_recursive(
75+
nums, mid + 1, right
76+
) # find max in range[mid + 1, right]
7577

7678
return left_max if left_max >= right_max else right_max
7779

maths/find_min.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ def find_min(nums: list[int | float]) -> int | float:
2929

3030

3131
# Divide and Conquer algorithm
32-
def find_min(nums: list[int | float], left: int, right: int) -> int | float:
32+
def find_min_recursive(nums: list[int | float], left: int, right: int) -> int | float:
3333
"""
3434
find min value in list
3535
:param nums: contains elements
@@ -62,7 +62,7 @@ def find_min(nums: list[int | float], left: int, right: int) -> int | float:
6262
IndexError: list index out of range
6363
"""
6464
if len(nums) == 0:
65-
raise ValueError("find_min() arg is an empty sequence")
65+
raise ValueError("find_min_recursive() arg is an empty sequence")
6666
if (
6767
left >= len(nums)
6868
or left < -len(nums)
@@ -73,8 +73,10 @@ def find_min(nums: list[int | float], left: int, right: int) -> int | float:
7373
if left == right:
7474
return nums[left]
7575
mid = (left + right) >> 1 # the middle
76-
left_min = find_min(nums, left, mid) # find min in range[left, mid]
77-
right_min = find_min(nums, mid + 1, right) # find min in range[mid + 1, right]
76+
left_min = find_min_recursive(nums, left, mid) # find min in range[left, mid]
77+
right_min = find_min_recursive(
78+
nums, mid + 1, right
79+
) # find min in range[mid + 1, right]
7880

7981
return left_min if left_min <= right_min else right_min
8082

maths/gamma.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
Python's Standard Library gamma() function overflows around gamma(171.624).
66
"""
77

8-
from math import pi, sqrt, exp
8+
from math import exp, pi, sqrt
99

1010
from numpy import inf
1111
from scipy.integrate import quad
@@ -106,7 +106,7 @@ def test_gamma() -> None:
106106
assert gamma(0.5) == sqrt(pi)
107107
assert gamma(1) == 1.0
108108
assert gamma(2) == 1.0
109-
109+
110110

111111
if __name__ == "__main__":
112112
from doctest import testmod
@@ -117,4 +117,4 @@ def test_gamma() -> None:
117117
while num:
118118
num = float(input("Gamma of: "))
119119
print(f"gamma({num}) = {gamma(num)}")
120-
print("\nEnter 0 to exit...")
120+
print("\nEnter 0 to exit...")

0 commit comments

Comments
 (0)