Skip to content

Commit 090c66d

Browse files
tianyizheng02github-actions
authored andcommitted
Remove duplicate implementation of Collatz sequence (TheAlgorithms#8836)
* updating DIRECTORY.md * Remove duplicate implementation of Collatz sequence * updating DIRECTORY.md * Add suggestions from PR review --------- Co-authored-by: github-actions <${GITHUB_ACTOR}@users.noreply.github.com>
1 parent add927a commit 090c66d

File tree

3 files changed

+46
-175
lines changed

3 files changed

+46
-175
lines changed

Diff for: DIRECTORY.md

-1
Original file line numberDiff line numberDiff line change
@@ -522,7 +522,6 @@
522522
* [Xgboost Regressor](machine_learning/xgboost_regressor.py)
523523

524524
## Maths
525-
* [3N Plus 1](maths/3n_plus_1.py)
526525
* [Abs](maths/abs.py)
527526
* [Add](maths/add.py)
528527
* [Addition Without Arithmetic](maths/addition_without_arithmetic.py)

Diff for: maths/3n_plus_1.py

-151
This file was deleted.

Diff for: maths/collatz_sequence.py

+46-23
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,66 @@
1+
"""
2+
The Collatz conjecture is a famous unsolved problem in mathematics. Given a starting
3+
positive integer, define the following sequence:
4+
- If the current term n is even, then the next term is n/2.
5+
- If the current term n is odd, then the next term is 3n + 1.
6+
The conjecture claims that this sequence will always reach 1 for any starting number.
7+
8+
Other names for this problem include the 3n + 1 problem, the Ulam conjecture, Kakutani's
9+
problem, the Thwaites conjecture, Hasse's algorithm, the Syracuse problem, and the
10+
hailstone sequence.
11+
12+
Reference: https://en.wikipedia.org/wiki/Collatz_conjecture
13+
"""
14+
115
from __future__ import annotations
216

17+
from collections.abc import Generator
318

4-
def collatz_sequence(n: int) -> list[int]:
19+
20+
def collatz_sequence(n: int) -> Generator[int, None, None]:
521
"""
6-
Collatz conjecture: start with any positive integer n. The next term is
7-
obtained as follows:
8-
If n term is even, the next term is: n / 2 .
9-
If n is odd, the next term is: 3 * n + 1.
10-
11-
The conjecture states the sequence will always reach 1 for any starting value n.
12-
Example:
13-
>>> collatz_sequence(2.1)
22+
Generate the Collatz sequence starting at n.
23+
>>> tuple(collatz_sequence(2.1))
1424
Traceback (most recent call last):
1525
...
16-
Exception: Sequence only defined for natural numbers
17-
>>> collatz_sequence(0)
26+
Exception: Sequence only defined for positive integers
27+
>>> tuple(collatz_sequence(0))
1828
Traceback (most recent call last):
1929
...
20-
Exception: Sequence only defined for natural numbers
21-
>>> collatz_sequence(43) # doctest: +NORMALIZE_WHITESPACE
22-
[43, 130, 65, 196, 98, 49, 148, 74, 37, 112, 56, 28, 14, 7,
23-
22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1]
30+
Exception: Sequence only defined for positive integers
31+
>>> tuple(collatz_sequence(4))
32+
(4, 2, 1)
33+
>>> tuple(collatz_sequence(11))
34+
(11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1)
35+
>>> tuple(collatz_sequence(31)) # doctest: +NORMALIZE_WHITESPACE
36+
(31, 94, 47, 142, 71, 214, 107, 322, 161, 484, 242, 121, 364, 182, 91, 274, 137,
37+
412, 206, 103, 310, 155, 466, 233, 700, 350, 175, 526, 263, 790, 395, 1186, 593,
38+
1780, 890, 445, 1336, 668, 334, 167, 502, 251, 754, 377, 1132, 566, 283, 850, 425,
39+
1276, 638, 319, 958, 479, 1438, 719, 2158, 1079, 3238, 1619, 4858, 2429, 7288, 3644,
40+
1822, 911, 2734, 1367, 4102, 2051, 6154, 3077, 9232, 4616, 2308, 1154, 577, 1732,
41+
866, 433, 1300, 650, 325, 976, 488, 244, 122, 61, 184, 92, 46, 23, 70, 35, 106, 53,
42+
160, 80, 40, 20, 10, 5, 16, 8, 4, 2, 1)
43+
>>> tuple(collatz_sequence(43)) # doctest: +NORMALIZE_WHITESPACE
44+
(43, 130, 65, 196, 98, 49, 148, 74, 37, 112, 56, 28, 14, 7, 22, 11, 34, 17, 52, 26,
45+
13, 40, 20, 10, 5, 16, 8, 4, 2, 1)
2446
"""
25-
2647
if not isinstance(n, int) or n < 1:
27-
raise Exception("Sequence only defined for natural numbers")
48+
raise Exception("Sequence only defined for positive integers")
2849

29-
sequence = [n]
50+
yield n
3051
while n != 1:
31-
n = 3 * n + 1 if n & 1 else n // 2
32-
sequence.append(n)
33-
return sequence
52+
if n % 2 == 0:
53+
n //= 2
54+
else:
55+
n = 3 * n + 1
56+
yield n
3457

3558

3659
def main():
3760
n = 43
38-
sequence = collatz_sequence(n)
61+
sequence = tuple(collatz_sequence(n))
3962
print(sequence)
40-
print(f"collatz sequence from {n} took {len(sequence)} steps.")
63+
print(f"Collatz sequence from {n} took {len(sequence)} steps.")
4164

4265

4366
if __name__ == "__main__":

0 commit comments

Comments
 (0)